From: Pavel Emelyanov <xemul@parallels.com>
To: Linux MM <linux-mm@kvack.org>, Hugh Dickins <hughd@google.com>
Subject: Unexpected mremap + shared anon mapping behavior
Date: Fri, 08 Mar 2013 12:27:56 +0400 [thread overview]
Message-ID: <5139A10C.3060507@parallels.com> (raw)
Hi!
I've recently noticed that the following user-space code
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/mman.h>
#define PAGE_SIZE (4096)
int main(void)
{
char *mem = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, 0, 0);
mem = mremap(mem, PAGE_SIZE, 2 * PAGE_SIZE, MREMAP_MAYMOVE);
mem[0] = 'a';
mem[PAGE_SIZE] = 'b';
return 0;
}
generates SIGBUS on the 2nd page access. But if we change MAP_SHARED into MAP_PRIVATE
in the mmap() call, it starts working OK.
This happens because when doing a MAP_SHARED | MAP_ANON area, the kernel sets up a shmem
file for the mapping, but the subsequent mremap() doesn't grow it. Thus a page-fault into
the 2nd page happens to be beyond this file i_size, resulting in SIGBUS.
So, the question is -- what should the mremap() behavior be for shared anonymous mappings?
Should it truncate the file to match the grown-up vma length? If yes, should it also
truncate it if we mremap() the mapping to the smaller size?
I also have to note, that before the /proc/PID/map_files/ directory appeared in Linux it
was impossible to fix this behavior from the application side. Now app can (yes, it's a
hack) open the respective shmem file via this dir and manually truncate one. It does help.
Thanks,
Pavel
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next reply other threads:[~2013-03-08 8:28 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-08 8:27 Pavel Emelyanov [this message]
2013-03-08 8:53 ` Unexpected mremap + shared anon mapping behavior Kirill A. Shutemov
2013-03-08 9:04 ` Pavel Emelyanov
2013-03-12 2:53 ` Hugh Dickins
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=5139A10C.3060507@parallels.com \
--to=xemul@parallels.com \
--cc=hughd@google.com \
--cc=linux-mm@kvack.org \
/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.