From: Yauheni Kaliuta <yauheni.kaliuta@redhat.com>
To: bpf@vger.kernel.org
Cc: Andrii Nakryiko <andriin@fb.com>, Jiri Olsa <jolsa@redhat.com>,
Jiri Benc <jbenc@redhat.com>
Subject: selftests: bpf: mmap question
Date: Thu, 23 Jul 2020 14:02:02 +0300 [thread overview]
Message-ID: <xunyft9i1olx.fsf@redhat.com> (raw)
Hi!
I have a question about the part of the test:
/* check some more advanced mmap() manipulations */
/* map all but last page: pages 1-3 mapped */
tmp1 = mmap(NULL, 3 * page_size, PROT_READ, MAP_SHARED,
data_map_fd, 0);
if (CHECK(tmp1 == MAP_FAILED, "adv_mmap1", "errno %d\n", errno))
goto cleanup;
/* unmap second page: pages 1, 3 mapped */
err = munmap(tmp1 + page_size, page_size);
if (CHECK(err, "adv_mmap2", "errno %d\n", errno)) {
munmap(tmp1, map_sz);
goto cleanup;
}
/* map page 2 back */
tmp2 = mmap(tmp1 + page_size, page_size, PROT_READ,
MAP_SHARED | MAP_FIXED, data_map_fd, 0);
if (CHECK(tmp2 == MAP_FAILED, "adv_mmap3", "errno %d\n", errno)) {
munmap(tmp1, page_size);
munmap(tmp1 + 2*page_size, page_size);
goto cleanup;
}
CHECK(tmp1 + page_size != tmp2, "adv_mmap4",
"tmp1: %p, tmp2: %p\n", tmp1, tmp2);
/* re-map all 4 pages */
tmp2 = mmap(tmp1, 4 * page_size, PROT_READ, MAP_SHARED | MAP_FIXED,
data_map_fd, 0);
if (CHECK(tmp2 == MAP_FAILED, "adv_mmap5", "errno %d\n", errno)) {
munmap(tmp1, 3 * page_size); /* unmap page 1 */
goto cleanup;
}
CHECK(tmp1 != tmp2, "adv_mmap6", "tmp1: %p, tmp2: %p\n", tmp1, tmp2);
In my configuration the first mapping
/* map all but last page: pages 1-3 mapped */
tmp1 = mmap(NULL, 3 * page_size, PROT_READ, MAP_SHARED,
data_map_fd, 0);
maps the area to the 3 pages right before the TLS page.
I find it's pretty ok.
But then the 4 page mapping
/* re-map all 4 pages */
tmp2 = mmap(tmp1, 4 * page_size, PROT_READ, MAP_SHARED | MAP_FIXED,
data_map_fd, 0);
since it has MAP_FIXED flag, unmaps TLS and maps the former TLS
address BPF map.
Which is again exactly the behaviour of MAP_FIXED, but it breaks
the test.
Using MAP_FIXED_NOREPLACE fails the check:
CHECK(tmp1 != tmp2, "adv_mmap6", "tmp1: %p, tmp2: %p\n", tmp1, tmp2);
as expected.
Should the test be modified to be a bit more relaxed? Since the
kernel behaviour looks correct or I'm missing something?
PS: BTW, the previous data_map mapping left unmmaped. Is it expected?
--
WBR,
Yauheni Kaliuta
next reply other threads:[~2020-07-23 11:02 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-23 11:02 Yauheni Kaliuta [this message]
2020-07-28 5:15 ` selftests: bpf: mmap question Andrii Nakryiko
2020-08-10 15:31 ` Yauheni Kaliuta
2020-08-11 0:27 ` Andrii Nakryiko
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=xunyft9i1olx.fsf@redhat.com \
--to=yauheni.kaliuta@redhat.com \
--cc=andriin@fb.com \
--cc=bpf@vger.kernel.org \
--cc=jbenc@redhat.com \
--cc=jolsa@redhat.com \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.