]> granicus.if.org Git - postgresql/commit
Avoid SIGBUS on Linux when a DSM memory request overruns tmpfs.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Sep 2017 20:09:19 +0000 (16:09 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 25 Sep 2017 20:09:19 +0000 (16:09 -0400)
commit899bd785c0edf376077d3f5d65c316f92c1b64b5
tree36b34442e55b2267f3b93cfc5459b83635bd50cb
parent716ea626a88ac510523ab3af5bc779d78eeced58
Avoid SIGBUS on Linux when a DSM memory request overruns tmpfs.

On Linux, shared memory segments created with shm_open() are backed by
swap files created in tmpfs.  If the swap file needs to be extended,
but there's no tmpfs space left, you get a very unfriendly SIGBUS trap.
To avoid this, force allocation of the full request size when we create
the segment.  This adds a few cycles, but none that we wouldn't expend
later anyway, assuming the request isn't hugely bigger than the actual
need.

Make this code #ifdef __linux__, because (a) there's not currently a
reason to think the same problem exists on other platforms, and (b)
applying posix_fallocate() to an FD created by shm_open() isn't very
portable anyway.

Back-patch to 9.4 where the DSM code came in.

Thomas Munro, per a bug report from Amul Sul

Discussion: https://postgr.es/m/1002664500.12301802.1471008223422.JavaMail.yahoo@mail.yahoo.com
configure
configure.in
src/backend/storage/ipc/dsm_impl.c
src/include/pg_config.h.in
src/include/pg_config.h.win32