All of lore.kernel.org
 help / color / mirror / Atom feed
* mmap()ing a size-extended file on a 100% full tmpfs
@ 2014-06-23 13:35 Adam Endrodi
  2014-06-23 23:23 ` Hugh Dickins
  0 siblings, 1 reply; 2+ messages in thread
From: Adam Endrodi @ 2014-06-23 13:35 UTC (permalink / raw)
  To: Hugh Dickins; +Cc: linux-mm


Hello,


If you try to run the following program with /dev/shm being 100% full, it will
be terminated by a SIGBUS in memset():

"""
#define _GNU_SOURCE
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>

int main(void)
{
	int fd = shm_open("segg", O_CREAT|O_RDWR, 0666);
	printf("fd: %d\n", fd);
	printf("truncate: %d\n", ftruncate(fd, 1024*1024));
//	errno = posix_fallocate(fd, 0, 1024*1024);
//	printf("falloc: %s\n", strerror(errno));
	void *ptr = mmap(NULL, 1024*1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
	printf("ptr: %p\n", ptr);

	memset(ptr, 0, 1024*1024);

	return 0;
}
"""

On a similarly full ext2 file system memset() completes successfully (though
I'm not sure whether it made through it by mere chance).

So the probelm is that the program may not know at all what the underlying
file system is, and in case of tmpfs it may be terminated for a completely
unexpected reason.

A portable solution could be to [posix_]fallocate() the file before trying to
mmap() it.  That works (except that perhaps tmpfs can deallocate memory if
it's under pressure).

Alternatively I could imagine such an ftruncate() implementation for tmpfs,
which would incorporate fallocate()ion.

In combination with this mmap() could refuse the operation if insufficient
backing store is available.  Ie. it would return MAP_FAILED if the programmer
didn't call ftruncate() which would include fallocate().

The wayland developers faced the same problem last year:
http://lists.freedesktop.org/archives/wayland-devel/2013-October/011501.html

My opinion is that either ftruncate() or mmap() should return an error.
What do you think?

-- 
adam

--
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>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-06-23 23:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-23 13:35 mmap()ing a size-extended file on a 100% full tmpfs Adam Endrodi
2014-06-23 23:23 ` Hugh Dickins

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.