xref: /freebsd-src/lib/libsys/shm_open.2 (revision 8269e7673cf033aba67dab8264fe719920c70f87)
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