1*8269e767SBrooks Davis.\" 2*8269e767SBrooks Davis.\" Copyright 2000 Massachusetts Institute of Technology 3*8269e767SBrooks Davis.\" 4*8269e767SBrooks Davis.\" Permission to use, copy, modify, and distribute this software and 5*8269e767SBrooks Davis.\" its documentation for any purpose and without fee is hereby 6*8269e767SBrooks Davis.\" granted, provided that both the above copyright notice and this 7*8269e767SBrooks Davis.\" permission notice appear in all copies, that both the above 8*8269e767SBrooks Davis.\" copyright notice and this permission notice appear in all 9*8269e767SBrooks Davis.\" supporting documentation, and that the name of M.I.T. not be used 10*8269e767SBrooks Davis.\" in advertising or publicity pertaining to distribution of the 11*8269e767SBrooks Davis.\" software without specific, written prior permission. M.I.T. makes 12*8269e767SBrooks Davis.\" no representations about the suitability of this software for any 13*8269e767SBrooks Davis.\" purpose. It is provided "as is" without express or implied 14*8269e767SBrooks Davis.\" warranty. 15*8269e767SBrooks Davis.\" 16*8269e767SBrooks Davis.\" THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''. M.I.T. DISCLAIMS 17*8269e767SBrooks Davis.\" ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE, 18*8269e767SBrooks Davis.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*8269e767SBrooks Davis.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT 20*8269e767SBrooks Davis.\" SHALL M.I.T. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21*8269e767SBrooks Davis.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22*8269e767SBrooks Davis.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 23*8269e767SBrooks Davis.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24*8269e767SBrooks Davis.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25*8269e767SBrooks Davis.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 26*8269e767SBrooks Davis.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27*8269e767SBrooks Davis.\" SUCH DAMAGE. 28*8269e767SBrooks Davis.\" 29*8269e767SBrooks Davis.Dd January 30, 2023 30*8269e767SBrooks Davis.Dt SHM_OPEN 2 31*8269e767SBrooks Davis.Os 32*8269e767SBrooks Davis.Sh NAME 33*8269e767SBrooks Davis.Nm memfd_create , shm_create_largepage , shm_open , shm_rename, shm_unlink 34*8269e767SBrooks Davis.Nd "shared memory object operations" 35*8269e767SBrooks Davis.Sh LIBRARY 36*8269e767SBrooks Davis.Lb libc 37*8269e767SBrooks Davis.Sh SYNOPSIS 38*8269e767SBrooks Davis.In sys/types.h 39*8269e767SBrooks Davis.In sys/mman.h 40*8269e767SBrooks Davis.In fcntl.h 41*8269e767SBrooks Davis.Ft int 42*8269e767SBrooks Davis.Fn memfd_create "const char *name" "unsigned int flags" 43*8269e767SBrooks Davis.Ft int 44*8269e767SBrooks Davis.Fo shm_create_largepage 45*8269e767SBrooks Davis.Fa "const char *path" 46*8269e767SBrooks Davis.Fa "int flags" 47*8269e767SBrooks Davis.Fa "int psind" 48*8269e767SBrooks Davis.Fa "int alloc_policy" 49*8269e767SBrooks Davis.Fa "mode_t mode" 50*8269e767SBrooks Davis.Fc 51*8269e767SBrooks Davis.Ft int 52*8269e767SBrooks Davis.Fn shm_open "const char *path" "int flags" "mode_t mode" 53*8269e767SBrooks Davis.Ft int 54*8269e767SBrooks Davis.Fn shm_rename "const char *path_from" "const char *path_to" "int flags" 55*8269e767SBrooks Davis.Ft int 56*8269e767SBrooks Davis.Fn shm_unlink "const char *path" 57*8269e767SBrooks Davis.Sh DESCRIPTION 58*8269e767SBrooks DavisThe 59*8269e767SBrooks Davis.Fn shm_open 60*8269e767SBrooks Davisfunction opens (or optionally creates) a 61*8269e767SBrooks DavisPOSIX 62*8269e767SBrooks Davisshared memory object named 63*8269e767SBrooks Davis.Fa path . 64*8269e767SBrooks DavisThe 65*8269e767SBrooks Davis.Fa flags 66*8269e767SBrooks Davisargument contains a subset of the flags used by 67*8269e767SBrooks Davis.Xr open 2 . 68*8269e767SBrooks DavisAn access mode of either 69*8269e767SBrooks Davis.Dv O_RDONLY 70*8269e767SBrooks Davisor 71*8269e767SBrooks Davis.Dv O_RDWR 72*8269e767SBrooks Davismust be included in 73*8269e767SBrooks Davis.Fa flags . 74*8269e767SBrooks DavisThe optional flags 75*8269e767SBrooks Davis.Dv O_CREAT , 76*8269e767SBrooks Davis.Dv O_EXCL , 77*8269e767SBrooks Davisand 78*8269e767SBrooks Davis.Dv O_TRUNC 79*8269e767SBrooks Davismay also be specified. 80*8269e767SBrooks Davis.Pp 81*8269e767SBrooks DavisIf 82*8269e767SBrooks Davis.Dv O_CREAT 83*8269e767SBrooks Davisis specified, 84*8269e767SBrooks Davisthen a new shared memory object named 85*8269e767SBrooks Davis.Fa path 86*8269e767SBrooks Daviswill be created if it does not exist. 87*8269e767SBrooks DavisIn this case, 88*8269e767SBrooks Davisthe shared memory object is created with mode 89*8269e767SBrooks Davis.Fa mode 90*8269e767SBrooks Davissubject to the process' umask value. 91*8269e767SBrooks DavisIf both the 92*8269e767SBrooks Davis.Dv O_CREAT 93*8269e767SBrooks Davisand 94*8269e767SBrooks Davis.Dv O_EXCL 95*8269e767SBrooks Davisflags are specified and a shared memory object named 96*8269e767SBrooks Davis.Fa path 97*8269e767SBrooks Davisalready exists, 98*8269e767SBrooks Davisthen 99*8269e767SBrooks Davis.Fn shm_open 100*8269e767SBrooks Daviswill fail with 101*8269e767SBrooks Davis.Er EEXIST . 102*8269e767SBrooks Davis.Pp 103*8269e767SBrooks DavisNewly created objects start off with a size of zero. 104*8269e767SBrooks DavisIf an existing shared memory object is opened with 105*8269e767SBrooks Davis.Dv O_RDWR 106*8269e767SBrooks Davisand the 107*8269e767SBrooks Davis.Dv O_TRUNC 108*8269e767SBrooks Davisflag is specified, 109*8269e767SBrooks Davisthen the shared memory object will be truncated to a size of zero. 110*8269e767SBrooks DavisThe size of the object can be adjusted via 111*8269e767SBrooks Davis.Xr ftruncate 2 112*8269e767SBrooks Davisand queried via 113*8269e767SBrooks Davis.Xr fstat 2 . 114*8269e767SBrooks Davis.Pp 115*8269e767SBrooks DavisThe new descriptor is set to close during 116*8269e767SBrooks Davis.Xr execve 2 117*8269e767SBrooks Davissystem calls; 118*8269e767SBrooks Davissee 119*8269e767SBrooks Davis.Xr close 2 120*8269e767SBrooks Davisand 121*8269e767SBrooks Davis.Xr fcntl 2 . 122*8269e767SBrooks Davis.Pp 123*8269e767SBrooks DavisThe constant 124*8269e767SBrooks Davis.Dv SHM_ANON 125*8269e767SBrooks Davismay be used for the 126*8269e767SBrooks Davis.Fa path 127*8269e767SBrooks Davisargument to 128*8269e767SBrooks Davis.Fn shm_open . 129*8269e767SBrooks DavisIn this case, an anonymous, unnamed shared memory object is created. 130*8269e767SBrooks DavisSince the object has no name, 131*8269e767SBrooks Davisit cannot be removed via a subsequent call to 132*8269e767SBrooks Davis.Fn shm_unlink , 133*8269e767SBrooks Davisor moved with a call to 134*8269e767SBrooks Davis.Fn shm_rename . 135*8269e767SBrooks DavisInstead, 136*8269e767SBrooks Davisthe shared memory object will be garbage collected when the last reference to 137*8269e767SBrooks Davisthe shared memory object is removed. 138*8269e767SBrooks DavisThe shared memory object may be shared with other processes by sharing the 139*8269e767SBrooks Davisfile descriptor via 140*8269e767SBrooks Davis.Xr fork 2 141*8269e767SBrooks Davisor 142*8269e767SBrooks Davis.Xr sendmsg 2 . 143*8269e767SBrooks DavisAttempting to open an anonymous shared memory object with 144*8269e767SBrooks Davis.Dv O_RDONLY 145*8269e767SBrooks Daviswill fail with 146*8269e767SBrooks Davis.Er EINVAL . 147*8269e767SBrooks DavisAll other flags are ignored. 148*8269e767SBrooks Davis.Pp 149*8269e767SBrooks DavisThe 150*8269e767SBrooks Davis.Fn shm_create_largepage 151*8269e767SBrooks Davisfunction behaves similarly to 152*8269e767SBrooks Davis.Fn shm_open , 153*8269e767SBrooks Davisexcept that the 154*8269e767SBrooks Davis.Dv O_CREAT 155*8269e767SBrooks Davisflag is implicitly specified, and the returned 156*8269e767SBrooks Davis.Dq largepage 157*8269e767SBrooks Davisobject is always backed by aligned, physically contiguous chunks of memory. 158*8269e767SBrooks DavisThis ensures that the object can be mapped using so-called 159*8269e767SBrooks Davis.Dq superpages , 160*8269e767SBrooks Daviswhich can improve application performance in some workloads by reducing the 161*8269e767SBrooks Davisnumber of translation lookaside buffer (TLB) entries required to access a 162*8269e767SBrooks Davismapping of the object, 163*8269e767SBrooks Davisand by reducing the number of page faults performed when accessing a mapping. 164*8269e767SBrooks DavisThis happens automatically for all largepage objects. 165*8269e767SBrooks Davis.Pp 166*8269e767SBrooks DavisAn existing largepage object can be opened using the 167*8269e767SBrooks Davis.Fn shm_open 168*8269e767SBrooks Davisfunction. 169*8269e767SBrooks DavisLargepage shared memory objects behave slightly differently from non-largepage 170*8269e767SBrooks Davisobjects: 171*8269e767SBrooks Davis.Bl -bullet -offset indent 172*8269e767SBrooks Davis.It 173*8269e767SBrooks DavisMemory for a largepage object is allocated when the object is 174*8269e767SBrooks Davisextended using the 175*8269e767SBrooks Davis.Xr ftruncate 2 176*8269e767SBrooks Davissystem call, whereas memory for regular shared memory objects is allocated 177*8269e767SBrooks Davislazily and may be paged out to a swap device when not in use. 178*8269e767SBrooks Davis.It 179*8269e767SBrooks DavisThe size of a mapping of a largepage object must be a multiple of the 180*8269e767SBrooks Davisunderlying large page size. 181*8269e767SBrooks DavisMost attributes of such a mapping can only be modified at the granularity 182*8269e767SBrooks Davisof the large page size. 183*8269e767SBrooks DavisFor example, when using 184*8269e767SBrooks Davis.Xr munmap 2 185*8269e767SBrooks Davisto unmap a portion of a largepage object mapping, or when using 186*8269e767SBrooks Davis.Xr mprotect 2 187*8269e767SBrooks Davisto adjust protections of a mapping of a largepage object, the starting address 188*8269e767SBrooks Davismust be large page size-aligned, and the length of the operation must be a 189*8269e767SBrooks Davismultiple of the large page size. 190*8269e767SBrooks DavisIf not, the corresponding system call will fail and set 191*8269e767SBrooks Davis.Va errno 192*8269e767SBrooks Davisto 193*8269e767SBrooks Davis.Er EINVAL . 194*8269e767SBrooks Davis.El 195*8269e767SBrooks Davis.Pp 196*8269e767SBrooks DavisThe 197*8269e767SBrooks Davis.Fa psind 198*8269e767SBrooks Davisargument to 199*8269e767SBrooks Davis.Fn shm_create_largepage 200*8269e767SBrooks Davisspecifies the size of large pages used to back the object. 201*8269e767SBrooks DavisThis argument is an index into the page sizes array returned by 202*8269e767SBrooks Davis.Xr getpagesizes 3 . 203*8269e767SBrooks DavisIn particular, all large pages backing a largepage object must be of the 204*8269e767SBrooks Davissame size. 205*8269e767SBrooks DavisFor example, on a system with large page sizes of 2MB and 1GB, a 2GB largepage 206*8269e767SBrooks Davisobject will consist of either 1024 2MB pages, or 2 1GB pages, depending on 207*8269e767SBrooks Davisthe value specified for the 208*8269e767SBrooks Davis.Fa psind 209*8269e767SBrooks Davisargument. 210*8269e767SBrooks DavisThe 211*8269e767SBrooks Davis.Fa alloc_policy 212*8269e767SBrooks Davisparameter specifies what happens when an attempt to use 213*8269e767SBrooks Davis.Xr ftruncate 2 214*8269e767SBrooks Davisto allocate memory for the object fails. 215*8269e767SBrooks DavisThe following values are accepted: 216*8269e767SBrooks Davis.Bl -tag -offset indent -width SHM_ 217*8269e767SBrooks Davis.It Dv SHM_LARGEPAGE_ALLOC_DEFAULT 218*8269e767SBrooks DavisIf the (non-blocking) memory allocation fails because there is insufficient free 219*8269e767SBrooks Daviscontiguous memory, the kernel will attempt to defragment physical memory and 220*8269e767SBrooks Davistry another allocation. 221*8269e767SBrooks DavisThe subsequent allocation may or may not succeed. 222*8269e767SBrooks DavisIf this subsequent allocation also fails, 223*8269e767SBrooks Davis.Xr ftruncate 2 224*8269e767SBrooks Daviswill fail and set 225*8269e767SBrooks Davis.Va errno 226*8269e767SBrooks Davisto 227*8269e767SBrooks Davis.Er ENOMEM . 228*8269e767SBrooks Davis.It Dv SHM_LARGEPAGE_ALLOC_NOWAIT 229*8269e767SBrooks DavisIf the memory allocation fails, 230*8269e767SBrooks Davis.Xr ftruncate 2 231*8269e767SBrooks Daviswill fail and set 232*8269e767SBrooks Davis.Va errno 233*8269e767SBrooks Davisto 234*8269e767SBrooks Davis.Er ENOMEM . 235*8269e767SBrooks Davis.It Dv SHM_LARGEPAGE_ALLOC_HARD 236*8269e767SBrooks DavisThe kernel will attempt defragmentation until the allocation succeeds, 237*8269e767SBrooks Davisor an unblocked signal is delivered to the thread. 238*8269e767SBrooks DavisHowever, it is possible for physical memory to be fragmented such that the 239*8269e767SBrooks Davisallocation will never succeed. 240*8269e767SBrooks Davis.El 241*8269e767SBrooks Davis.Pp 242*8269e767SBrooks DavisThe 243*8269e767SBrooks Davis.Dv FIOSSHMLPGCNF 244*8269e767SBrooks Davisand 245*8269e767SBrooks Davis.Dv FIOGSHMLPGCNF 246*8269e767SBrooks Davis.Xr ioctl 2 247*8269e767SBrooks Daviscommands can be used with a largepage shared memory object to get and set 248*8269e767SBrooks Davislargepage object parameters. 249*8269e767SBrooks DavisBoth commands operate on the following structure: 250*8269e767SBrooks Davis.Bd -literal 251*8269e767SBrooks Davisstruct shm_largepage_conf { 252*8269e767SBrooks Davis int psind; 253*8269e767SBrooks Davis int alloc_policy; 254*8269e767SBrooks Davis}; 255*8269e767SBrooks Davis 256*8269e767SBrooks Davis.Ed 257*8269e767SBrooks DavisThe 258*8269e767SBrooks Davis.Dv FIOGSHMLPGCNF 259*8269e767SBrooks Daviscommand populates this structure with the current values of these parameters, 260*8269e767SBrooks Daviswhile the 261*8269e767SBrooks Davis.Dv FIOSSHMLPGCNF 262*8269e767SBrooks Daviscommand modifies the largepage object. 263*8269e767SBrooks DavisCurrently only the 264*8269e767SBrooks Davis.Va alloc_policy 265*8269e767SBrooks Davisparameter may be modified. 266*8269e767SBrooks DavisInternally, 267*8269e767SBrooks Davis.Fn shm_create_largepage 268*8269e767SBrooks Davisworks by creating a regular shared memory object using 269*8269e767SBrooks Davis.Fn shm_open , 270*8269e767SBrooks Davisand then converting it into a largepage object using the 271*8269e767SBrooks Davis.Dv FIOSSHMLPGCNF 272*8269e767SBrooks Davisioctl command. 273*8269e767SBrooks Davis.Pp 274*8269e767SBrooks DavisThe 275*8269e767SBrooks Davis.Fn shm_rename 276*8269e767SBrooks Davissystem call atomically removes a shared memory object named 277*8269e767SBrooks Davis.Fa path_from 278*8269e767SBrooks Davisand relinks it at 279*8269e767SBrooks Davis.Fa path_to . 280*8269e767SBrooks DavisIf another object is already linked at 281*8269e767SBrooks Davis.Fa path_to , 282*8269e767SBrooks Davisthat object will be unlinked, unless one of the following flags are provided: 283*8269e767SBrooks Davis.Bl -tag -offset indent -width Er 284*8269e767SBrooks Davis.It Er SHM_RENAME_EXCHANGE 285*8269e767SBrooks DavisAtomically exchange the shms at 286*8269e767SBrooks Davis.Fa path_from 287*8269e767SBrooks Davisand 288*8269e767SBrooks Davis.Fa path_to . 289*8269e767SBrooks Davis.It Er SHM_RENAME_NOREPLACE 290*8269e767SBrooks DavisReturn an error if an shm exists at 291*8269e767SBrooks Davis.Fa path_to , 292*8269e767SBrooks Davisrather than unlinking it. 293*8269e767SBrooks Davis.El 294*8269e767SBrooks Davis.Pp 295*8269e767SBrooks DavisThe 296*8269e767SBrooks Davis.Fn shm_unlink 297*8269e767SBrooks Davissystem call removes a shared memory object named 298*8269e767SBrooks Davis.Fa path . 299*8269e767SBrooks Davis.Pp 300*8269e767SBrooks DavisThe 301*8269e767SBrooks Davis.Fn memfd_create 302*8269e767SBrooks Davisfunction creates an anonymous shared memory object, identical to that created 303*8269e767SBrooks Davisby 304*8269e767SBrooks Davis.Fn shm_open 305*8269e767SBrooks Daviswhen 306*8269e767SBrooks Davis.Dv SHM_ANON 307*8269e767SBrooks Davisis specified. 308*8269e767SBrooks DavisNewly created objects start off with a size of zero. 309*8269e767SBrooks DavisThe size of the new object must be adjusted via 310*8269e767SBrooks Davis.Xr ftruncate 2 . 311*8269e767SBrooks Davis.Pp 312*8269e767SBrooks DavisThe 313*8269e767SBrooks Davis.Fa name 314*8269e767SBrooks Davisargument must not be 315*8269e767SBrooks Davis.Dv NULL , 316*8269e767SBrooks Davisbut it may be an empty string. 317*8269e767SBrooks DavisThe length of the 318*8269e767SBrooks Davis.Fa name 319*8269e767SBrooks Davisargument may not exceed 320*8269e767SBrooks Davis.Dv NAME_MAX 321*8269e767SBrooks Davisminus six characters for the prefix 322*8269e767SBrooks Davis.Dq memfd: , 323*8269e767SBrooks Daviswhich will be prepended. 324*8269e767SBrooks DavisThe 325*8269e767SBrooks Davis.Fa name 326*8269e767SBrooks Davisargument is intended solely for debugging purposes and will never be used by the 327*8269e767SBrooks Daviskernel to identify a memfd. 328*8269e767SBrooks DavisNames are therefore not required to be unique. 329*8269e767SBrooks Davis.Pp 330*8269e767SBrooks DavisThe following 331*8269e767SBrooks Davis.Fa flags 332*8269e767SBrooks Davismay be specified to 333*8269e767SBrooks Davis.Fn memfd_create : 334*8269e767SBrooks Davis.Bl -tag -width MFD_ALLOW_SEALING 335*8269e767SBrooks Davis.It Dv MFD_CLOEXEC 336*8269e767SBrooks DavisSet 337*8269e767SBrooks Davis.Dv FD_CLOEXEC 338*8269e767SBrooks Davison the resulting file descriptor. 339*8269e767SBrooks Davis.It Dv MFD_ALLOW_SEALING 340*8269e767SBrooks DavisAllow adding seals to the resulting file descriptor using the 341*8269e767SBrooks Davis.Dv F_ADD_SEALS 342*8269e767SBrooks Davis.Xr fcntl 2 343*8269e767SBrooks Daviscommand. 344*8269e767SBrooks Davis.It Dv MFD_HUGETLB 345*8269e767SBrooks DavisThis flag is currently unsupported. 346*8269e767SBrooks Davis.El 347*8269e767SBrooks Davis.Sh RETURN VALUES 348*8269e767SBrooks DavisIf successful, 349*8269e767SBrooks Davis.Fn memfd_create 350*8269e767SBrooks Davisand 351*8269e767SBrooks Davis.Fn shm_open 352*8269e767SBrooks Davisboth return a non-negative integer, 353*8269e767SBrooks Davisand 354*8269e767SBrooks Davis.Fn shm_rename 355*8269e767SBrooks Davisand 356*8269e767SBrooks Davis.Fn shm_unlink 357*8269e767SBrooks Davisreturn zero. 358*8269e767SBrooks DavisAll functions return -1 on failure, and set 359*8269e767SBrooks Davis.Va errno 360*8269e767SBrooks Davisto indicate the error. 361*8269e767SBrooks Davis.Sh COMPATIBILITY 362*8269e767SBrooks DavisThe 363*8269e767SBrooks Davis.Fn shm_create_largepage 364*8269e767SBrooks Davisand 365*8269e767SBrooks Davis.Fn shm_rename 366*8269e767SBrooks Davisfunctions are 367*8269e767SBrooks Davis.Fx 368*8269e767SBrooks Davisextensions, as is support for the 369*8269e767SBrooks Davis.Dv SHM_ANON 370*8269e767SBrooks Davisvalue in 371*8269e767SBrooks Davis.Fn shm_open . 372*8269e767SBrooks Davis.Pp 373*8269e767SBrooks DavisThe 374*8269e767SBrooks Davis.Fa path , 375*8269e767SBrooks Davis.Fa path_from , 376*8269e767SBrooks Davisand 377*8269e767SBrooks Davis.Fa path_to 378*8269e767SBrooks Davisarguments do not necessarily represent a pathname (although they do in 379*8269e767SBrooks Davismost other implementations). 380*8269e767SBrooks DavisTwo processes opening the same 381*8269e767SBrooks Davis.Fa path 382*8269e767SBrooks Davisare guaranteed to access the same shared memory object if and only if 383*8269e767SBrooks Davis.Fa path 384*8269e767SBrooks Davisbegins with a slash 385*8269e767SBrooks Davis.Pq Ql \&/ 386*8269e767SBrooks Davischaracter. 387*8269e767SBrooks Davis.Pp 388*8269e767SBrooks DavisOnly the 389*8269e767SBrooks Davis.Dv O_RDONLY , 390*8269e767SBrooks Davis.Dv O_RDWR , 391*8269e767SBrooks Davis.Dv O_CREAT , 392*8269e767SBrooks Davis.Dv O_EXCL , 393*8269e767SBrooks Davisand 394*8269e767SBrooks Davis.Dv O_TRUNC 395*8269e767SBrooks Davisflags may be used in portable programs. 396*8269e767SBrooks Davis.Pp 397*8269e767SBrooks DavisPOSIX 398*8269e767SBrooks Davisspecifications state that the result of using 399*8269e767SBrooks Davis.Xr open 2 , 400*8269e767SBrooks Davis.Xr read 2 , 401*8269e767SBrooks Davisor 402*8269e767SBrooks Davis.Xr write 2 403*8269e767SBrooks Davison a shared memory object, or on the descriptor returned by 404*8269e767SBrooks Davis.Fn shm_open , 405*8269e767SBrooks Davisis undefined. 406*8269e767SBrooks DavisHowever, the 407*8269e767SBrooks Davis.Fx 408*8269e767SBrooks Daviskernel implementation explicitly includes support for 409*8269e767SBrooks Davis.Xr read 2 410*8269e767SBrooks Davisand 411*8269e767SBrooks Davis.Xr write 2 . 412*8269e767SBrooks Davis.Pp 413*8269e767SBrooks Davis.Fx 414*8269e767SBrooks Davisalso supports zero-copy transmission of data from shared memory 415*8269e767SBrooks Davisobjects with 416*8269e767SBrooks Davis.Xr sendfile 2 . 417*8269e767SBrooks Davis.Pp 418*8269e767SBrooks DavisNeither shared memory objects nor their contents persist across reboots. 419*8269e767SBrooks Davis.Pp 420*8269e767SBrooks DavisWrites do not extend shared memory objects, so 421*8269e767SBrooks Davis.Xr ftruncate 2 422*8269e767SBrooks Davismust be called before any data can be written. 423*8269e767SBrooks DavisSee 424*8269e767SBrooks Davis.Sx EXAMPLES . 425*8269e767SBrooks Davis.Sh EXAMPLES 426*8269e767SBrooks DavisThis example fails without the call to 427*8269e767SBrooks Davis.Xr ftruncate 2 : 428*8269e767SBrooks Davis.Bd -literal -compact 429*8269e767SBrooks Davis 430*8269e767SBrooks Davis uint8_t buffer[getpagesize()]; 431*8269e767SBrooks Davis ssize_t len; 432*8269e767SBrooks Davis int fd; 433*8269e767SBrooks Davis 434*8269e767SBrooks Davis fd = shm_open(SHM_ANON, O_RDWR | O_CREAT, 0600); 435*8269e767SBrooks Davis if (fd < 0) 436*8269e767SBrooks Davis err(EX_OSERR, "%s: shm_open", __func__); 437*8269e767SBrooks Davis if (ftruncate(fd, getpagesize()) < 0) 438*8269e767SBrooks Davis err(EX_IOERR, "%s: ftruncate", __func__); 439*8269e767SBrooks Davis len = pwrite(fd, buffer, getpagesize(), 0); 440*8269e767SBrooks Davis if (len < 0) 441*8269e767SBrooks Davis err(EX_IOERR, "%s: pwrite", __func__); 442*8269e767SBrooks Davis if (len != getpagesize()) 443*8269e767SBrooks Davis errx(EX_IOERR, "%s: pwrite length mismatch", __func__); 444*8269e767SBrooks Davis.Ed 445*8269e767SBrooks Davis.Sh ERRORS 446*8269e767SBrooks Davis.Fn memfd_create 447*8269e767SBrooks Davisfails with these error codes for these conditions: 448*8269e767SBrooks Davis.Bl -tag -width Er 449*8269e767SBrooks Davis.It Bq Er EBADF 450*8269e767SBrooks DavisThe 451*8269e767SBrooks Davis.Fa name 452*8269e767SBrooks Davisargument was NULL. 453*8269e767SBrooks Davis.It Bq Er EINVAL 454*8269e767SBrooks DavisThe 455*8269e767SBrooks Davis.Fa name 456*8269e767SBrooks Davisargument was too long. 457*8269e767SBrooks Davis.Pp 458*8269e767SBrooks DavisAn invalid or unsupported flag was included in 459*8269e767SBrooks Davis.Fa flags . 460*8269e767SBrooks Davis.It Bq Er EMFILE 461*8269e767SBrooks DavisThe process has already reached its limit for open file descriptors. 462*8269e767SBrooks Davis.It Bq Er ENFILE 463*8269e767SBrooks DavisThe system file table is full. 464*8269e767SBrooks Davis.It Bq Er ENOSYS 465*8269e767SBrooks DavisIn 466*8269e767SBrooks Davis.Fa memfd_create , 467*8269e767SBrooks Davis.Dv MFD_HUGETLB 468*8269e767SBrooks Daviswas specified in 469*8269e767SBrooks Davis.Fa flags , 470*8269e767SBrooks Davisand this system does not support forced hugetlb mappings. 471*8269e767SBrooks Davis.El 472*8269e767SBrooks Davis.Pp 473*8269e767SBrooks Davis.Fn shm_open 474*8269e767SBrooks Davisfails with these error codes for these conditions: 475*8269e767SBrooks Davis.Bl -tag -width Er 476*8269e767SBrooks Davis.It Bq Er EINVAL 477*8269e767SBrooks DavisA flag other than 478*8269e767SBrooks Davis.Dv O_RDONLY , 479*8269e767SBrooks Davis.Dv O_RDWR , 480*8269e767SBrooks Davis.Dv O_CREAT , 481*8269e767SBrooks Davis.Dv O_EXCL , 482*8269e767SBrooks Davisor 483*8269e767SBrooks Davis.Dv O_TRUNC 484*8269e767SBrooks Daviswas included in 485*8269e767SBrooks Davis.Fa flags . 486*8269e767SBrooks Davis.It Bq Er EMFILE 487*8269e767SBrooks DavisThe process has already reached its limit for open file descriptors. 488*8269e767SBrooks Davis.It Bq Er ENFILE 489*8269e767SBrooks DavisThe system file table is full. 490*8269e767SBrooks Davis.It Bq Er EINVAL 491*8269e767SBrooks Davis.Dv O_RDONLY 492*8269e767SBrooks Daviswas specified while creating an anonymous shared memory object via 493*8269e767SBrooks Davis.Dv SHM_ANON . 494*8269e767SBrooks Davis.It Bq Er EFAULT 495*8269e767SBrooks DavisThe 496*8269e767SBrooks Davis.Fa path 497*8269e767SBrooks Davisargument points outside the process' allocated address space. 498*8269e767SBrooks Davis.It Bq Er ENAMETOOLONG 499*8269e767SBrooks DavisThe entire pathname exceeds 1023 characters. 500*8269e767SBrooks Davis.It Bq Er EINVAL 501*8269e767SBrooks DavisThe 502*8269e767SBrooks Davis.Fa path 503*8269e767SBrooks Davisdoes not begin with a slash 504*8269e767SBrooks Davis.Pq Ql \&/ 505*8269e767SBrooks Davischaracter. 506*8269e767SBrooks Davis.It Bq Er ENOENT 507*8269e767SBrooks Davis.Dv O_CREAT 508*8269e767SBrooks Davisis not specified and the named shared memory object does not exist. 509*8269e767SBrooks Davis.It Bq Er EEXIST 510*8269e767SBrooks Davis.Dv O_CREAT 511*8269e767SBrooks Davisand 512*8269e767SBrooks Davis.Dv O_EXCL 513*8269e767SBrooks Davisare specified and the named shared memory object does exist. 514*8269e767SBrooks Davis.It Bq Er EACCES 515*8269e767SBrooks DavisThe required permissions (for reading or reading and writing) are denied. 516*8269e767SBrooks Davis.It Bq Er ECAPMODE 517*8269e767SBrooks DavisThe process is running in capability mode (see 518*8269e767SBrooks Davis.Xr capsicum 4 ) 519*8269e767SBrooks Davisand attempted to create a named shared memory object. 520*8269e767SBrooks Davis.El 521*8269e767SBrooks Davis.Pp 522*8269e767SBrooks Davis.Fn shm_create_largepage 523*8269e767SBrooks Daviscan fail for the reasons listed above. 524*8269e767SBrooks DavisIt also fails with these error codes for the following conditions: 525*8269e767SBrooks Davis.Bl -tag -width Er 526*8269e767SBrooks Davis.It Bq Er ENOTTY 527*8269e767SBrooks DavisThe kernel does not support large pages on the current platform. 528*8269e767SBrooks Davis.El 529*8269e767SBrooks Davis.Pp 530*8269e767SBrooks DavisThe following errors are defined for 531*8269e767SBrooks Davis.Fn shm_rename : 532*8269e767SBrooks Davis.Bl -tag -width Er 533*8269e767SBrooks Davis.It Bq Er EFAULT 534*8269e767SBrooks DavisThe 535*8269e767SBrooks Davis.Fa path_from 536*8269e767SBrooks Davisor 537*8269e767SBrooks Davis.Fa path_to 538*8269e767SBrooks Davisargument points outside the process' allocated address space. 539*8269e767SBrooks Davis.It Bq Er ENAMETOOLONG 540*8269e767SBrooks DavisThe entire pathname exceeds 1023 characters. 541*8269e767SBrooks Davis.It Bq Er ENOENT 542*8269e767SBrooks DavisThe shared memory object at 543*8269e767SBrooks Davis.Fa path_from 544*8269e767SBrooks Davisdoes not exist. 545*8269e767SBrooks Davis.It Bq Er EACCES 546*8269e767SBrooks DavisThe required permissions are denied. 547*8269e767SBrooks Davis.It Bq Er EEXIST 548*8269e767SBrooks DavisAn shm exists at 549*8269e767SBrooks Davis.Fa path_to , 550*8269e767SBrooks Davisand the 551*8269e767SBrooks Davis.Dv SHM_RENAME_NOREPLACE 552*8269e767SBrooks Davisflag was provided. 553*8269e767SBrooks Davis.El 554*8269e767SBrooks Davis.Pp 555*8269e767SBrooks Davis.Fn shm_unlink 556*8269e767SBrooks Davisfails with these error codes for these conditions: 557*8269e767SBrooks Davis.Bl -tag -width Er 558*8269e767SBrooks Davis.It Bq Er EFAULT 559*8269e767SBrooks DavisThe 560*8269e767SBrooks Davis.Fa path 561*8269e767SBrooks Davisargument points outside the process' allocated address space. 562*8269e767SBrooks Davis.It Bq Er ENAMETOOLONG 563*8269e767SBrooks DavisThe entire pathname exceeds 1023 characters. 564*8269e767SBrooks Davis.It Bq Er ENOENT 565*8269e767SBrooks DavisThe named shared memory object does not exist. 566*8269e767SBrooks Davis.It Bq Er EACCES 567*8269e767SBrooks DavisThe required permissions are denied. 568*8269e767SBrooks Davis.Fn shm_unlink 569*8269e767SBrooks Davisrequires write permission to the shared memory object. 570*8269e767SBrooks Davis.El 571*8269e767SBrooks Davis.Sh SEE ALSO 572*8269e767SBrooks Davis.Xr posixshmcontrol 1 , 573*8269e767SBrooks Davis.Xr close 2 , 574*8269e767SBrooks Davis.Xr fstat 2 , 575*8269e767SBrooks Davis.Xr ftruncate 2 , 576*8269e767SBrooks Davis.Xr ioctl 2 , 577*8269e767SBrooks Davis.Xr mmap 2 , 578*8269e767SBrooks Davis.Xr munmap 2 , 579*8269e767SBrooks Davis.Xr sendfile 2 580*8269e767SBrooks Davis.Sh STANDARDS 581*8269e767SBrooks DavisThe 582*8269e767SBrooks Davis.Fn memfd_create 583*8269e767SBrooks Davisfunction is expected to be compatible with the Linux system call of the same 584*8269e767SBrooks Davisname. 585*8269e767SBrooks Davis.Pp 586*8269e767SBrooks DavisThe 587*8269e767SBrooks Davis.Fn shm_open 588*8269e767SBrooks Davisand 589*8269e767SBrooks Davis.Fn shm_unlink 590*8269e767SBrooks Davisfunctions are believed to conform to 591*8269e767SBrooks Davis.St -p1003.1b-93 . 592*8269e767SBrooks Davis.Sh HISTORY 593*8269e767SBrooks DavisThe 594*8269e767SBrooks Davis.Fn memfd_create 595*8269e767SBrooks Davisfunction appeared in 596*8269e767SBrooks Davis.Fx 13.0 . 597*8269e767SBrooks Davis.Pp 598*8269e767SBrooks DavisThe 599*8269e767SBrooks Davis.Fn shm_open 600*8269e767SBrooks Davisand 601*8269e767SBrooks Davis.Fn shm_unlink 602*8269e767SBrooks Davisfunctions first appeared in 603*8269e767SBrooks Davis.Fx 4.3 . 604*8269e767SBrooks DavisThe functions were reimplemented as system calls using shared memory objects 605*8269e767SBrooks Davisdirectly rather than files in 606*8269e767SBrooks Davis.Fx 8.0 . 607*8269e767SBrooks Davis.Pp 608*8269e767SBrooks Davis.Fn shm_rename 609*8269e767SBrooks Davisfirst appeared in 610*8269e767SBrooks Davis.Fx 13.0 611*8269e767SBrooks Davisas a 612*8269e767SBrooks Davis.Fx 613*8269e767SBrooks Davisextension. 614*8269e767SBrooks Davis.Sh AUTHORS 615*8269e767SBrooks Davis.An Garrett A. Wollman Aq Mt wollman@FreeBSD.org 616*8269e767SBrooks Davis(C library support and this manual page) 617*8269e767SBrooks Davis.Pp 618*8269e767SBrooks Davis.An Matthew Dillon Aq Mt dillon@FreeBSD.org 619*8269e767SBrooks Davis.Pq Dv MAP_NOSYNC 620*8269e767SBrooks Davis.Pp 621*8269e767SBrooks Davis.An Matthew Bryan Aq Mt matthew.bryan@isilon.com 622*8269e767SBrooks Davis.Pq Dv shm_rename implementation 623