]> git.karo-electronics.de Git - karo-tx-linux.git/commit
shmem: update memory reservation on truncate
authorKonstantin Khlebnikov <koct9i@gmail.com>
Thu, 26 Jun 2014 00:42:43 +0000 (10:42 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 26 Jun 2014 00:42:43 +0000 (10:42 +1000)
commit9900bb1b6a14558e86ed4435e8a72e36c1190806
tree7fd82e200ba90e91cba1f3b46a7d1968bd749d6f
parent0b6849b6dea6c654280886049a158049cf90f89d
shmem: update memory reservation on truncate

A shared anonymous mapping created without MAP_NORESERVE holds memory
reservation for whole range of shmem segment.  Usually there is no way to
change its size, but /proc/<pid>/map_files/...  (available if
CONFIG_CHECKPOINT_RESTORE=y) allows that.

This patch adjusts the memory reservation in shmem_setattr().

exploit:

#include <sys/mman.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char **argv)
{
unsigned long addr;
char path[100];

/* charge 4KiB */
addr = (unsigned long)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
sprintf(path, "/proc/self/map_files/%lx-%lx", addr, addr + 4096);
truncate(path, 1 << 30);
/* uncharge 1GiB */
}

Signed-off-by: Konstantin Khlebnikov <koct9i@gmail.com>
Cc: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/shmem.c