From: Cyrill Gorcunov <gorcunov@gmail.com> To: tml <tarantool-patches@freelists.org> Cc: Vladimir Davydov <vdavydov.dev@gmail.com>, Cyrill Gorcunov <gorcunov@gmail.com> Subject: [PATCH 3/3] test: slab_arena -- Verify madvise Date: Wed, 1 May 2019 18:50:06 +0300 [thread overview] Message-ID: <20190501155006.14546-4-gorcunov@gmail.com> (raw) In-Reply-To: <20190501155006.14546-1-gorcunov@gmail.com> Since madvise support depends on sys libraries and kernel version we print error if only small supports it and /proc/self/smaps provide more less decent VmFlags. Part of #3509 --- https://github.com/tarantool/tarantool/issues/3509 test/slab_arena.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/test/slab_arena.c b/test/slab_arena.c index d0a78d1..5c5085c 100644 --- a/test/slab_arena.c +++ b/test/slab_arena.c @@ -3,6 +3,7 @@ #include <stdio.h> #include <limits.h> #include <stdlib.h> +#include <string.h> #include <time.h> #include "unit.h" @@ -15,6 +16,93 @@ slab_arena_print(struct slab_arena *arena) arena->used, arena->slab_size); } +#define is_hex_digit(c) \ + (((c) >= '0' && (c) <= '9') || \ + ((c) >= 'a' && (c) <= 'f') || \ + ((c) >= 'A' && (c) <= 'F')) + +static int is_vma_range_fmt(char *line, unsigned long *start, unsigned long *end) +{ + char *p = line; + while (*line && is_hex_digit(*line)) + line++; + + if (*line++ != '-') + return 0; + + while (*line && is_hex_digit(*line)) + line++; + + if (*line++ != ' ') + return 0; + + sscanf(p, "%lx-%lx", start, end); + return 1; +} + +static void +slab_test_madvise(void) +{ + struct slab_arena arena; + struct quota quota; + FILE *f = NULL; + void *ptr; + + quota_init("a, 2000000); + slab_arena_create(&arena, "a, 3000000, 1, MAP_PRIVATE); + + /* + * Will fetch from preallocated area. + */ + ptr = slab_map(&arena); + if (!ptr) { + printf("can't obtain slab\n"); + goto out; + } + + /* + * If system supports madvise call, we should try + * fetch the precise VMA state from smaps file, + * but if only it exists. + */ + if (!slab_arena_madvise_dontdump(&arena)) { + unsigned long start = 0, end = 0; + char buf[1024], *tok = NULL; + bool found = false; + + f = fopen("/proc/self/smaps", "r"); + if (!f) + goto out; + + while (fgets(buf, sizeof(buf), f)) { + is_vma_range_fmt(buf, &start, &end); + if (strncmp(buf, "VmFlags: ", 9) || (void *)start != ptr) + continue; + tok = buf; + break; + } + + if (tok) { + for (tok = strtok(tok, " \n"); tok; + tok = strtok(NULL, " \n")) { + if (strcmp(tok, "dd")) + continue; + found = true; + break; + } + } + + if (!found) + printf("ERROR: Expected dd flag on VMA address %p\n", ptr); + + fclose(f); + } + +out: + slab_unmap(&arena, ptr); + slab_arena_destroy(&arena); +} + int main() { struct quota quota; @@ -42,4 +130,6 @@ int main() slab_arena_create(&arena, "a, 3000000, 1, MAP_PRIVATE); slab_arena_print(&arena); slab_arena_destroy(&arena); + + slab_test_madvise(); } -- 2.20.1
next prev parent reply other threads:[~2019-05-01 15:50 UTC|newest] Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-05-01 15:50 [PATCH 0/3] small: Prepare ground for madvise Cyrill Gorcunov 2019-05-01 15:50 ` [PATCH 1/3] build: Check for madvise syscall Cyrill Gorcunov 2019-05-06 10:25 ` Vladimir Davydov 2019-05-06 10:39 ` Cyrill Gorcunov 2019-05-01 15:50 ` [PATCH 2/3] slab_arena: Provide slab_arena_madvise_create to madvice slabs Cyrill Gorcunov 2019-05-06 10:38 ` Vladimir Davydov 2019-05-06 11:03 ` Cyrill Gorcunov 2019-05-06 13:46 ` Alexander Turenko 2019-05-01 15:50 ` Cyrill Gorcunov [this message] 2019-05-06 10:45 ` [PATCH 3/3] test: slab_arena -- Verify madvise Vladimir Davydov 2019-05-06 10:48 ` Cyrill Gorcunov 2019-05-06 10:55 ` Vladimir Davydov 2019-05-06 10:57 ` Cyrill Gorcunov 2019-05-06 11:04 ` Alexander Turenko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190501155006.14546-4-gorcunov@gmail.com \ --to=gorcunov@gmail.com \ --cc=tarantool-patches@freelists.org \ --cc=vdavydov.dev@gmail.com \ --subject='Re: [PATCH 3/3] test: slab_arena -- Verify madvise' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox