From: Mathieu Desnoyers Date: Thu, 16 Apr 2015 21:15:45 +0000 (-0400) Subject: Implement wrapper around get_pfnblock_flags_mask X-Git-Tag: v2.6.1~24 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=165eee701dce7f180d958125c1794459280fe64d;p=lttng-modules.git Implement wrapper around get_pfnblock_flags_mask This is used by kmem instrumentation, and changed in 4.0.0. This change has been backported to 3.19.2 stable kernel. Signed-off-by: Mathieu Desnoyers --- diff --git a/Makefile b/Makefile index 871ff1a7..07d9d72e 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,8 @@ lttng-tracer-objs := lttng-events.o lttng-abi.o \ lttng-context-vtid.o lttng-context-ppid.o \ lttng-context-vppid.o lttng-calibrate.o \ lttng-context-hostname.o wrapper/random.o \ - probes/lttng.o wrapper/trace-clock.o + probes/lttng.o wrapper/trace-clock.o \ + wrapper/page_alloc.o obj-m += lttng-statedump.o lttng-statedump-objs := lttng-statedump-impl.o wrapper/irqdesc.o \ diff --git a/lttng-events.c b/lttng-events.c index 135c8c52..2820a0e4 100644 --- a/lttng-events.c +++ b/lttng-events.c @@ -20,6 +20,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/* + * This page_alloc.h wrapper needs to be included before gfpflags.h because it + * overrides a function with a define. + */ +#include "wrapper/page_alloc.h" + #include #include #include @@ -1271,7 +1277,9 @@ static int __init lttng_events_init(void) ret = wrapper_lttng_fixup_sig(THIS_MODULE); if (ret) return ret; - + ret = wrapper_get_pfnblock_flags_mask_init(); + if (ret) + return ret; ret = lttng_tracepoint_init(); if (ret) return ret; diff --git a/probes/lttng-probe-kmem.c b/probes/lttng-probe-kmem.c index c8252ec0..01202418 100644 --- a/probes/lttng-probe-kmem.c +++ b/probes/lttng-probe-kmem.c @@ -21,6 +21,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +/* + * This page_alloc.h wrapper needs to be included before gfpflags.h because it + * overrides a function with a define. + */ +#include "../wrapper/page_alloc.h" #include #include "../lttng-tracer.h" diff --git a/wrapper/page_alloc.c b/wrapper/page_alloc.c new file mode 100644 index 00000000..184ec71c --- /dev/null +++ b/wrapper/page_alloc.c @@ -0,0 +1,68 @@ +/* + * wrapper/page_alloc.c + * + * wrapper around get_pfnblock_flags_mask. Using KALLSYMS to get its address + * when available, else we need to have a kernel that exports this function to + * GPL modules. + * + * Copyright (C) 2015 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "../lttng-kernel-version.h" + +#if defined(CONFIG_KALLSYMS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2)) + +#include +#include +#include +#include "kallsyms.h" +#include "page_alloc.h" + +static +unsigned long (*get_pfnblock_flags_mask_sym)(struct page *page, + unsigned long pfn, + unsigned long end_bitidx, + unsigned long mask); + +unsigned long wrapper_get_pfnblock_flags_mask(struct page *page, + unsigned long pfn, + unsigned long end_bitidx, + unsigned long mask) +{ + WARN_ON_ONCE(!get_pfnblock_flags_mask_sym); + if (get_pfnblock_flags_mask_sym) { + return get_pfnblock_flags_mask_sym(page, pfn, end_bitidx, mask); + } else { + return -ENOSYS; + } +} +EXPORT_SYMBOL_GPL(wrapper_get_pfnblock_flags_mask); + +int wrapper_get_pfnblock_flags_mask_init(void) +{ + get_pfnblock_flags_mask_sym = + (void *) kallsyms_lookup_funcptr("get_pfnblock_flags_mask"); + if (!get_pfnblock_flags_mask_sym) + return -1; + return 0; +} + +#else /* #if defined(CONFIG_KALLSYMS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2)) */ + +#include + +#endif /* #else #if defined(CONFIG_KALLSYMS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2)) */ diff --git a/wrapper/page_alloc.h b/wrapper/page_alloc.h new file mode 100644 index 00000000..06e2ddcb --- /dev/null +++ b/wrapper/page_alloc.h @@ -0,0 +1,54 @@ +#ifndef _LTTNG_WRAPPER_PAGE_ALLOC_H +#define _LTTNG_WRAPPER_PAGE_ALLOC_H + +/* + * wrapper/page_alloc.h + * + * wrapper around get_pfnblock_flags_mask. Using KALLSYMS to get its address + * when available, else we need to have a kernel that exports this function to + * GPL modules. + * + * Copyright (C) 2015 Mathieu Desnoyers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "../lttng-kernel-version.h" + +/* + * We need to redefine get_pfnblock_flags_mask to our wrapper, because + * the get_pageblock_migratetype() macro uses it. + */ +#if defined(CONFIG_KALLSYMS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2)) + +#define get_pfnblock_flags_mask wrapper_get_pfnblock_flags_mask + +#include + +int wrapper_get_pfnblock_flags_mask_init(void); + +#else /* #if defined(CONFIG_KALLSYMS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2)) */ + +#include + +static inline +int wrapper_get_pfnblock_flags_mask_init(void) +{ + return 0; +} + +#endif /* else #if defined(CONFIG_KALLSYMS) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,2)) */ + +#endif /* _LTTNG_WRAPPER_PAGE_ALLOC_H */