Monday 7 March 2022

Android vendor hook for common kernel

The vendor hook are requires to mainline vendor changes into upstream android common kernel.

Add support for vendor hooks. Adds include/trace/hooks directory for trace definition headers where hooks can be defined and vendor_hook.c for instantiating and exporting them for vendor modules.


There are two variants of vendor hooks, both based on tracepoints:

Normal: this uses the DECLARE_HOOK macro

to create a tracepoint function with the name trace_<name>where <name> is the unique identifier for the trace.

Restricted: restricted hooks are needed for cases like scheduler hooks where the attached function must be called even if the cpu is offline or requires a non-atomic context. Restricted vendor hooks cannot be detached, so modules that attach to a restricted hook can never unload. Also, only 1 attachment is allowed (any other attempts to attach will fail with-EBUSY).

For either case, modules attach to the hook by using

register_trace_<name>(func_ptr, NULL).


New hooks should be defined in headers in the

include/trace/hooks/ directory using the

DECLARE_HOOK() or DECLARE_RESTRICTED_HOOK()

macros.


New files added to include/trace/hooks should

be #include'd from drivers/android/vendor_hooks.c.

The EXPORT_TRACEPOINT_SYMBOL_GPL() should be

also added to drivers/android/vendor_hooks.c.


For example, if a new hook, 'android_vh_foo(int &ret)'

is added in do_exit() in exit.c, these changes are

needed:


1. create a new header file include/trace/hooks/foo.h

which contains:

#include <trace/hooks/vendor_hooks.h>

...

  DECLARE_HOOK(android_vh_foo,

     TP_PROTO(int *retp),

     TP_ARGS(retp);


2. in exit.c, add

#include <trace/hooks/foo.h>

...

  int ret = 0;

...

  android_vh_foo(&ret);

  if (ret)

    return ret;

...


3. in drivers/android/vendor_hooks.c, add

#include <trace/hooks/foo.h>

...

EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_foo);


The hook can then be attached by adding the registration code

to the module:


#include <trace/hooks/sched.h>

...

static void my_foo(int *retp)

{

*retp = 0;

}

...

rc = register_trace_android_vh_sched_exit(my_foo, NULL);


Reference:

https://android.googlesource.com/kernel/common/+/7f62740112ef7260d399a340e210f3a49bc4177e

No comments:

Post a Comment