On 9/9/20 1:14 PM, Yang Xu wrote: > Hi Michael > >> 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)); > > The #ifdef CONFIG_CHECKPOINT_RESTORE only affected prepare_copy function > and the EINVAL judgment is not included in #ifdef. > So, if current kernel config disables CONFIG_CHECKPOINT_RESTORE, Using > MSG_COPY without IPC_NOWAIT will still hit EINVAL error firstly and > doesn't run into prepare_copy function to hit ENOSYS error. Ahh -- now I see what you mean. Thanks, Michael -- Michael Kerrisk Linux man-pages maintainer; http://www.kernel.org/doc/man-pages/ Linux/UNIX System Programming Training: http://man7.org/training/