 4a674f34ba
			
		
	
	
	4a674f34ba
	
	
	
		
			
			This patch is required for checkpoint/restore in userspace. c/r requires some way to get all pending IPC messages without deleting them from the queue (checkpoint can fail and in this case tasks will be resumed, so queue have to be valid). To achive this, new operation flag MSG_COPY for sys_msgrcv() system call was introduced. If this flag was specified, then mtype is interpreted as number of the message to copy. If MSG_COPY is set, then kernel will allocate dummy message with passed size, and then use new copy_msg() helper function to copy desired message (instead of unlinking it from the queue). Notes: 1) Return -ENOSYS if MSG_COPY is specified, but CONFIG_CHECKPOINT_RESTORE is not set. Signed-off-by: Stanislav Kinsbursky <skinsbursky@parallels.com> Cc: Serge Hallyn <serge.hallyn@canonical.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: Pavel Emelyanov <xemul@parallels.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _UAPI_LINUX_MSG_H
 | |
| #define _UAPI_LINUX_MSG_H
 | |
| 
 | |
| #include <linux/ipc.h>
 | |
| 
 | |
| /* ipcs ctl commands */
 | |
| #define MSG_STAT 11
 | |
| #define MSG_INFO 12
 | |
| 
 | |
| /* msgrcv options */
 | |
| #define MSG_NOERROR     010000  /* no error if message is too big */
 | |
| #define MSG_EXCEPT      020000  /* recv any msg except of specified type.*/
 | |
| #define MSG_COPY        040000  /* copy (not remove) all queue messages */
 | |
| 
 | |
| /* Obsolete, used only for backwards compatibility and libc5 compiles */
 | |
| struct msqid_ds {
 | |
| 	struct ipc_perm msg_perm;
 | |
| 	struct msg *msg_first;		/* first message on queue,unused  */
 | |
| 	struct msg *msg_last;		/* last message in queue,unused */
 | |
| 	__kernel_time_t msg_stime;	/* last msgsnd time */
 | |
| 	__kernel_time_t msg_rtime;	/* last msgrcv time */
 | |
| 	__kernel_time_t msg_ctime;	/* last change time */
 | |
| 	unsigned long  msg_lcbytes;	/* Reuse junk fields for 32 bit */
 | |
| 	unsigned long  msg_lqbytes;	/* ditto */
 | |
| 	unsigned short msg_cbytes;	/* current number of bytes on queue */
 | |
| 	unsigned short msg_qnum;	/* number of messages in queue */
 | |
| 	unsigned short msg_qbytes;	/* max number of bytes on queue */
 | |
| 	__kernel_ipc_pid_t msg_lspid;	/* pid of last msgsnd */
 | |
| 	__kernel_ipc_pid_t msg_lrpid;	/* last receive pid */
 | |
| };
 | |
| 
 | |
| /* Include the definition of msqid64_ds */
 | |
| #include <asm/msgbuf.h>
 | |
| 
 | |
| /* message buffer for msgsnd and msgrcv calls */
 | |
| struct msgbuf {
 | |
| 	long mtype;         /* type of message */
 | |
| 	char mtext[1];      /* message text */
 | |
| };
 | |
| 
 | |
| /* buffer for msgctl calls IPC_INFO, MSG_INFO */
 | |
| struct msginfo {
 | |
| 	int msgpool;
 | |
| 	int msgmap; 
 | |
| 	int msgmax; 
 | |
| 	int msgmnb; 
 | |
| 	int msgmni; 
 | |
| 	int msgssz; 
 | |
| 	int msgtql; 
 | |
| 	unsigned short  msgseg; 
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Scaling factor to compute msgmni:
 | |
|  * the memory dedicated to msg queues (msgmni * msgmnb) should occupy
 | |
|  * at most 1/MSG_MEM_SCALE of the lowmem (see the formula in ipc/msg.c):
 | |
|  * up to 8MB       : msgmni = 16 (MSGMNI)
 | |
|  * 4 GB            : msgmni = 8K
 | |
|  * more than 16 GB : msgmni = 32K (IPCMNI)
 | |
|  */
 | |
| #define MSG_MEM_SCALE 32
 | |
| 
 | |
| #define MSGMNI    16   /* <= IPCMNI */     /* max # of msg queue identifiers */
 | |
| #define MSGMAX  8192   /* <= INT_MAX */   /* max size of message (bytes) */
 | |
| #define MSGMNB 16384   /* <= INT_MAX */   /* default max size of a message queue */
 | |
| 
 | |
| /* unused */
 | |
| #define MSGPOOL (MSGMNI * MSGMNB / 1024) /* size in kbytes of message pool */
 | |
| #define MSGTQL  MSGMNB            /* number of system message headers */
 | |
| #define MSGMAP  MSGMNB            /* number of entries in message map */
 | |
| #define MSGSSZ  16                /* message segment size */
 | |
| #define __MSGSEG ((MSGPOOL * 1024) / MSGSSZ) /* max no. of segments */
 | |
| #define MSGSEG (__MSGSEG <= 0xffff ? __MSGSEG : 0xffff)
 | |
| 
 | |
| 
 | |
| #endif /* _UAPI_LINUX_MSG_H */
 |