Hello Yang Xu, On Wed, 9 Sep 2020 at 05:57, Yang Xu <xuyang2018.jy@xxxxxxxxxxxxxx> wrote: > > When calling msgrcv with MSG_COPY flag on 3.8 or new kernel, it will > report EINVAL error even we have disabled CONFIG_CHECKPOINT_RESTORE. > It also needs to specify IPC_NOWAIT flag. > > Signed-off-by: Yang Xu <xuyang2018.jy@xxxxxxxxxxxxxx> > --- > man2/msgop.2 | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/man2/msgop.2 b/man2/msgop.2 > index 373e53aa7..e559097a7 100644 > --- a/man2/msgop.2 > +++ b/man2/msgop.2 > @@ -467,7 +467,9 @@ and the queue contains less than > messages. > .TP > .BR ENOSYS " (since Linux 3.8)" > -.I MSG_COPY > +.B IPC_NOWAIT > +and > +.B MSG_COPY > was specified in > .IR msgflg , > and this kernel was configured without > -- > 2.23.0 My apologies, I have a little bit of trouble to understand your commit message, but the patch does seem to be wrong, at least as I understand the code: [[ #ifdef CONFIG_CHECKPOINT_RESTORE ... #else static inline struct msg_msg *prepare_copy(void __user *buf, size_t bufsz) { return ERR_PTR(-ENOSYS); } ... static long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgflg, long (*msg_handler)(void __user *, struct msg_msg *, size_t)) { ... if (msgflg & MSG_COPY) { if ((msgflg & MSG_EXCEPT) || !(msgflg & IPC_NOWAIT)) return -EINVAL; copy = prepare_copy(buf, min_t(size_t, bufsz, ns->msg_ctlmax)); ... } ]] My reading of that code is: if MSG_COPY && MSG_EXCEPT ==> EINVAL if MSG_COPY && ! IPC_NOWAIT ==> EINVAL if neither of the above: if MSG_COPY && ! CONFIG_CHECKPOINT_RESTORE ==> ENOSYS And all of that seems already to be captured in the manual page: EINVAL (since Linux 3.14) msgflg specified MSG_COPY, but not IPC_NOWAIT. EINVAL (since Linux 3.14) msgflg specified both MSG_COPY and MSG_EXCEPT. ENOSYS (since Linux 3.8) MSG_COPY was specified in msgflg, and this kernel was con‐ figured without CONFIG_CHECKPOINT_RESTORE. Have I missed something? Thanks, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/