[OpenWrt-Devel] [PATCH] kernel: generic 4.1 & 4.4 perf: musl compatibility

Roman Yeryomin leroi.lists at gmail.com
Thu Dec 31 07:22:14 EST 2015


On 29 December 2015 at 12:14, Kevin Darbyshire-Bryant
<kevin at darbyshire-bryant.me.uk> wrote:
> Enable linux perf tools to compile under musl.
>
> Tested on MIPS Archer c7 v2 & ARM Linksys 1200ac.
>
> With thanks to Dave Taht <dave.taht at bufferbloat.net> who
> did the heavy lifting.
>
> Signed-off-by: Kevin Darbyshire-Bryant <kevin at darbyshire-bryant.me.uk>
> ---
>  package/devel/perf/Makefile                        |   2 +-
>  .../patches-4.1/280-perf-fixes-for-musl.patch      | 148 +++++++++++++++++++++
>  .../patches-4.4/280-perf-fixes-for-musl.patch      | 147 ++++++++++++++++++++
>  3 files changed, 296 insertions(+), 1 deletion(-)
>  create mode 100644 target/linux/generic/patches-4.1/280-perf-fixes-for-musl.patch
>  create mode 100644 target/linux/generic/patches-4.4/280-perf-fixes-for-musl.patch
>
> diff --git a/package/devel/perf/Makefile b/package/devel/perf/Makefile
> index 5e3d63f..46ddb92 100644
> --- a/package/devel/perf/Makefile
> +++ b/package/devel/perf/Makefile
> @@ -19,7 +19,7 @@ include $(INCLUDE_DIR)/package.mk
>  define Package/perf
>    SECTION:=devel
>    CATEGORY:=Development
> -  DEPENDS:= @USE_GLIBC +libelf1 +libdw +libpthread +librt +binutils
> +  DEPENDS:= @USE_MUSL +libelf1 +libdw +libpthread +librt +binutils
>    TITLE:=Linux performance monitoring tool
>    VERSION:=$(LINUX_VERSION)-$(PKG_RELEASE)
>    URL:=http://www.kernel.org
> diff --git a/target/linux/generic/patches-4.1/280-perf-fixes-for-musl.patch b/target/linux/generic/patches-4.1/280-perf-fixes-for-musl.patch
> new file mode 100644
> index 0000000..0e8b6d8
> --- /dev/null
> +++ b/target/linux/generic/patches-4.1/280-perf-fixes-for-musl.patch
> @@ -0,0 +1,148 @@
> +kernel: 4.1 perf: musl compatibility
> +
> +Allow linux perf tool to compile under musl.
> +
> +Backport to 4.1 by Kevin D-B with thanks to Dave
> +Taht <dave.taht at bufferbloat.net> for the heavy lifting.
> +
> +Signed-off-by: Kevin Darbyshire-Bryant <kevin at darbyshire-bryant.me.uk>
> +
> +---
> + tools/lib/api/fs/debugfs.c         |  4 ++++
> + tools/lib/traceevent/event-parse.c |  4 ++++
> + tools/perf/perf.c                  | 17 ++++++++++++++++-
> + tools/perf/util/cache.h            |  2 +-
> + tools/perf/util/cloexec.c          |  4 ----
> + tools/perf/util/cloexec.h          |  4 ----
> + tools/perf/util/util.h             |  4 ++++
> + 7 files changed, 29 insertions(+), 10 deletions(-)
> +
> +diff --git a/tools/lib/api/fs/debugfs.c b/tools/lib/api/fs/debugfs.c
> +index 8305b3e..5d1745c 100644
> +--- a/tools/lib/api/fs/debugfs.c
> ++++ b/tools/lib/api/fs/debugfs.c
> +@@ -17,6 +17,10 @@
> + #define DEBUGFS_DEFAULT_PATH          "/sys/kernel/debug"
> + #endif
> +
> ++/* musl has a xpg compliant strerror_r by default */
> ++#define strerror_r(err, buf, buflen) \
> ++      (strerror_r(err, buf, buflen) ? NULL : buf)
> ++
> + char debugfs_mountpoint[PATH_MAX + 1] = DEBUGFS_DEFAULT_PATH;
> +
> + static const char * const debugfs_known_mountpoints[] = {
> +diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
> +index ed5461f..f151369 100644
> +--- a/tools/lib/traceevent/event-parse.c
> ++++ b/tools/lib/traceevent/event-parse.c
> +@@ -36,6 +36,10 @@
> + #include "event-parse.h"
> + #include "event-utils.h"
> +
> ++/* musl has a xpg compliant strerror_r by default */
> ++#define strerror_r(err, buf, buflen) \
> ++        (strerror_r(err, buf, buflen) ? NULL : buf)
> ++
> + static const char *input_buf;
> + static unsigned long long input_buf_ptr;
> + static unsigned long long input_buf_siz;
> +diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> +index b857fcb..3e67fa2 100644
> +--- a/tools/perf/perf.c
> ++++ b/tools/perf/perf.c
> +@@ -505,6 +505,21 @@ void pthread__unblock_sigwinch(void)
> +       pthread_sigmask(SIG_UNBLOCK, &set, NULL);
> + }
> +
> ++unsigned cache_line_size(void);
> ++
> ++unsigned cache_line_size(void) {
> ++      FILE * p = 0;
> ++      unsigned int i = 0;
> ++      p = fopen("/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size", "r");
> ++      if (p) {
> ++              if(fscanf(p, "%d", &i) != 1) {
> ++                      perror("cannot determine cache line size");
> ++              }
> ++              fclose(p);
> ++      }
> ++      return i;
> ++}
> ++

Kevin, are you sure this works?
I don't have /sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size
on my Archer C7
I did a little bit more simple way adding a header from eglibc. If
anybody interested I can submit the patch for RFC.


Regards,
Roman
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list