From 3aa8ef11ea0276b31249116181fdd5deef2c8219 Mon Sep 17 00:00:00 2001 From: Tao Liu Date: Mon, 26 Jun 2023 17:09:59 +0800 Subject: [PATCH] Rebase to latest upstream(e2d91c4823b) Release 0.2.5-1 Resolves: bz2165190 Signed-off-by: Tao Liu --- .gitignore | 1 + ...if-maximum-open-fds-reached-for-sys_.patch | 74 ++++++++++++++++ ...in-__process_stacktrace-for-page_own.patch | 88 ------------------- ...e-error-in-perf_handle_mm_page_alloc.patch | 53 ----------- memstrack.spec | 11 +-- sources | 2 +- 6 files changed, 82 insertions(+), 147 deletions(-) create mode 100644 0001-Enlarge-rlimits-if-maximum-open-fds-reached-for-sys_.patch delete mode 100644 0001-Skip-memcg-info-in-__process_stacktrace-for-page_own.patch delete mode 100644 0002-Fix-data-type-error-in-perf_handle_mm_page_alloc.patch diff --git a/.gitignore b/.gitignore index ded7cec..a29cf8d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ SOURCES/v0.2.4.tar.gz /v0.2.4.tar.gz +/v0.2.5.tar.gz diff --git a/0001-Enlarge-rlimits-if-maximum-open-fds-reached-for-sys_.patch b/0001-Enlarge-rlimits-if-maximum-open-fds-reached-for-sys_.patch new file mode 100644 index 0000000..2762e5c --- /dev/null +++ b/0001-Enlarge-rlimits-if-maximum-open-fds-reached-for-sys_.patch @@ -0,0 +1,74 @@ +From e2d91c4823b29ddd17e9b7ea966fe1dec53ae278 Mon Sep 17 00:00:00 2001 +From: Tao Liu +Date: Tue, 28 Mar 2023 15:08:04 +0800 +Subject: [PATCH] Enlarge rlimits if maximum open fds reached for + sys_perf_event_open + +The sys_perf_event_open may fail due to reaching the maximum number of open +file descriptors. In fedora the ulimit -n gives 1024 by default, and +sys_perf_event_open() failing can be seen on systems which have a large cpu +number: + + $ lscpu + Architecture: aarch64 + CPU(s): 224 + On-line CPU(s) list: 0-223 + ... + +In this case, for function perf_handling_init(), we will have +perf_event_ring_num = perf_event_enabled_num * 224, i.e. 6 * 224 = 1344, which +is larger than 1024. As a result, perf_ring_setup() will be called 1344 times. +And each time a sys_perf_event_open() will return a perf_fd. So the maximun +number of fds will exceed limits and fail. + +In this patch, we will try to enlarge rlimit if we have reached the maximum +number of open fds. + +Signed-off-by: Tao Liu +--- + src/backend/perf-events.c | 19 +++++++++++++++++++ + 1 file changed, 19 insertions(+) + +diff --git a/src/backend/perf-events.c b/src/backend/perf-events.c +index 67f1dad..7199925 100644 +--- a/src/backend/perf-events.c ++++ b/src/backend/perf-events.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + + #include "perf-internal.h" + #include "perf-events-define.h" +@@ -357,9 +358,27 @@ int perf_ring_setup(struct PerfEventRing *ring) { + attr.wakeup_watermark = WAKEUP_WATERMARK; + attr.watermark = 1; + ++retry: + perf_fd = sys_perf_event_open(&attr, -1, ring->cpu, -1, 0); + + if (perf_fd <= 0) { ++ if (errno == EMFILE) { ++ struct rlimit rl; ++ if (getrlimit(RLIMIT_NOFILE, &rl) != 0) { ++ log_error("Error getting rlimit value: %s\n", ++ strerror(errno)); ++ return errno; ++ } ++ rl.rlim_cur <<= 1; ++ rl.rlim_max <<= 1; ++ if (setrlimit(RLIMIT_NOFILE, &rl) != 0) { ++ log_error("Error setting rlimit value to be" ++ " rlim_cur(%lu) rlim_max(%lu): %s\n", ++ rl.rlim_cur, rl.rlim_max, strerror(errno)); ++ return errno; ++ } ++ goto retry; ++ } + log_error("Error calling perf_event_open: %s\n", strerror(errno)); + return errno; + } +-- +2.40.1 + diff --git a/0001-Skip-memcg-info-in-__process_stacktrace-for-page_own.patch b/0001-Skip-memcg-info-in-__process_stacktrace-for-page_own.patch deleted file mode 100644 index 87302d8..0000000 --- a/0001-Skip-memcg-info-in-__process_stacktrace-for-page_own.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 2d27b3694bf0996767b6e5282b9d39784d1524c1 Mon Sep 17 00:00:00 2001 -From: Tao Liu -Date: Mon, 11 Jul 2022 15:28:25 +0800 -Subject: [PATCH 1/2] Skip memcg info in __process_stacktrace for page_owner - backend - -Kernel patch set [1] extended page_owner to show memcg information: - -Page allocated via order 0, mask 0x0(), pid 1, tgid 1 (swapper/0), ts 158908732 ns, free_ts 0 ns -PFN 4540 type Unmovable Block 8 type Unmovable Flags 0xfffffc0010200(slab|head|node=0|zone=1|lastcpupid=0x1fffff) - register_early_stack+0x28/0x57 - init_page_owner+0x1d/0x2f - kernel_init_freeable+0x138/0x1a2 - kernel_init+0x16/0x120 -Slab cache page - -Page allocated via order 0, mask 0x400dc0(GFP_KERNEL_ACCOUNT|__GFP_ZERO), pid 737, tgid 737 (NetworkManager), ts 3964670439 ns, free_ts 3961489285 ns -PFN 11172 type Unmovable Block 21 type Unmovable Flags 0xfffffc0000000(node=0|zone=1|lastcpupid=0x1fffff) - get_page_from_freelist+0x3f0/0x500 - __alloc_pages+0xe6/0x230 - pte_alloc_one+0x15/0x50 - ... - asm_exc_page_fault+0x1e/0x30 -Charged (via objcg) to memcg NetworkManager.service - -"^Slab|^Charged" lines are unexpected for __process_stacktrace. -As a result, error messages as "Page owner stacktrace malformed" -will be output and fail. - -This patch fix the issue by skip the memcg info lines when iterating -stacktrace. - -[1]: https://lore.kernel.org/all/20220202203036.744010-3-longman@redhat.com/T/#mcd67a65c84092f71efb766d0d509f0e8255d4dc2 - -Signed-off-by: Tao Liu ---- - src/backend/page_owner.c | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - -diff --git a/src/backend/page_owner.c b/src/backend/page_owner.c -index f66d77d..156f688 100644 ---- a/src/backend/page_owner.c -+++ b/src/backend/page_owner.c -@@ -37,6 +37,23 @@ - - static char *page_owner_file; - -+static char *memcg_info[] = { -+ "Slab cache page", -+ "Charged ", -+}; -+ -+static int is_memcg_info(char *str) -+{ -+ for (int i = 0; -+ i < sizeof(memcg_info) / sizeof(__typeof__(memcg_info[0])); -+ i++) { -+ if (!strncmp(str, memcg_info[i], strlen(memcg_info[i]))) { -+ return true; -+ } -+ } -+ return false; -+} -+ - static struct Tracenode* __process_stacktrace( - struct Tracenode *tn, struct PageEvent *pe, char *line, FILE *file) - { -@@ -45,6 +62,7 @@ static struct Tracenode* __process_stacktrace( - int callsite_len; - unsigned long len; - -+retry: - if (!fgets(line, MAX_LINE, file)) { - log_error("Page owner file ended unexpectly before stacktrace.\n"); - return NULL; -@@ -56,6 +74,9 @@ static struct Tracenode* __process_stacktrace( - return NULL; - } - -+ if (is_memcg_info(line)) -+ goto retry; -+ - /* Empty line, end of a stacktrace */ - if (line[0] == '\n' || line[0] == '\r') - return tn; --- -2.33.1 - diff --git a/0002-Fix-data-type-error-in-perf_handle_mm_page_alloc.patch b/0002-Fix-data-type-error-in-perf_handle_mm_page_alloc.patch deleted file mode 100644 index 36ac599..0000000 --- a/0002-Fix-data-type-error-in-perf_handle_mm_page_alloc.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 8c42fcfa92998da170ee84cd24c2377db2e90f33 Mon Sep 17 00:00:00 2001 -From: Tao Liu -Date: Tue, 12 Jul 2022 19:41:25 +0800 -Subject: [PATCH 2/2] Fix data type error in perf_handle_mm_page_alloc - -For systems as s390, unsigned long and unsigned int are different in -size. After expanding the macro, the code will be: - -unsigned int order = *((unsigned long*) - (((const unsigned char*)(&raw->data)) + - ((struct __perf_event_field_table_mm_page_alloc*)(perf_event_mm_page_alloc.fields))->order_info.offset)); - -or simply: - -unsigned int order = *((unsigned long*) - (((const unsigned char*)(&raw->data)) + 16)); - -If we have the following data array: - -Raw data[16]: 0x0 -Raw data[17]: 0x0 -Raw data[18]: 0x0 -Raw data[19]: 0x2 -Raw data[20]: 0x0 -Raw data[21]: 0x0 -Raw data[22]: 0xc -Raw data[23]: 0xc0 - -The order will be: 0x0cc0, instead of 0x2. - -This patch will fix the error data type. - -Signed-off-by: Tao Liu ---- - src/backend/perf-events.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/backend/perf-events.c b/src/backend/perf-events.c -index 0252991..67f1dad 100644 ---- a/src/backend/perf-events.c -+++ b/src/backend/perf-events.c -@@ -156,7 +156,7 @@ static int perf_handle_mm_page_alloc(const unsigned char* header) { - sizeof(callchain->ips) * callchain->nr); - - unsigned long pfn = read_data_from_perf_raw(mm_page_alloc, pfn, unsigned long, raw); -- unsigned int order = read_data_from_perf_raw(mm_page_alloc, order, unsigned long, raw); -+ unsigned int order = read_data_from_perf_raw(mm_page_alloc, order, unsigned int, raw); - int pid = read_data_from_perf_raw(mm_page_alloc, common_pid, int, raw); - - // TODO: pfn == -1? --- -2.33.1 - diff --git a/memstrack.spec b/memstrack.spec index 011b940..1596116 100644 --- a/memstrack.spec +++ b/memstrack.spec @@ -1,8 +1,8 @@ # vim: syntax=spec Name: memstrack -Version: 0.2.4 -Release: 2%{?dist} +Version: 0.2.5 +Release: 1%{?dist} Summary: A memory allocation tracer, like a hot spot analyzer for memory allocation License: GPLv3 URL: https://github.com/ryncsn/memstrack @@ -12,8 +12,7 @@ BuildRequires: ncurses-devel Source: https://github.com/ryncsn/memstrack/archive/refs/tags/v%{version}.tar.gz -Patch1: 0001-Skip-memcg-info-in-__process_stacktrace-for-page_own.patch -Patch2: 0002-Fix-data-type-error-in-perf_handle_mm_page_alloc.patch +Patch1: 0001-Enlarge-rlimits-if-maximum-open-fds-reached-for-sys_.patch %description A memory allocation tracer, like a hot spot analyzer for memory allocation @@ -21,7 +20,6 @@ A memory allocation tracer, like a hot spot analyzer for memory allocation %prep %setup -q -n memstrack-%{version} %patch1 -p1 -%patch2 -p1 %build %{set_build_flags} @@ -37,6 +35,9 @@ install -p -m 755 memstrack %{buildroot}/%{_bindir} %{_bindir}/memstrack %changelog +* Mon Jun 26 2023 Tao Liu - 0.2.5-1 +- Rebase to latest upstream(e2d91c4823b) + * Fri Jul 15 2022 Tao Liu - 0.2.4-2 - Revert bz2107730 diff --git a/sources b/sources index 66c055f..916e1ad 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (v0.2.4.tar.gz) = 360426b2e027578aad468ec62cd50e07b24cfe57616746771e66fc3dafa9a0eb607f3ae957d39ad10c6fd0c8591d73fdd29ae99db4d284dc35c27efb5108879c +SHA512 (v0.2.5.tar.gz) = a344c03b39780bdb223bd2d4e195f0977e07f3a53fc8ed823fa15a612441b432ff0818ff84f272abdedcee80d616f461bbabee876ee6129a76ed944b2ce74430