From nobody Mon Apr 6 09:10:55 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 344432BDC2A for ; Fri, 20 Mar 2026 05:24:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984268; cv=none; b=CGBhraM966VeAzuQmKbqMOrqgp1KJWkv71p0jXeG4jU7cGLYQiz5sBn/D/XLSZzXTkUVf5Hy1PGysVjovaPJDCNm/BKWUI9aucKCEP2knkg8WldL/QmuTYGwQfth2qjDVsxb3zg1HOKQHy2+bUB/WWvhnk6FqqQBMfnp9NFo1Y8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984268; c=relaxed/simple; bh=RLab7y+WF7eTkkWgtNJDfg2TaHxCj/lPEIM7ZFRMteE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cOsxVhO2nFVUse46cRGTfNlfQq07oYz/fkxdngbyOJMiYYKksNZm0H6r4+QVLrQPeJMFf0z9FUJqUnKA6k6UkM82mljaNj7yNSKO6EINxr23T5SREL78slGB4fXgJk1YCvnqpzGpYxoxGsKtLNsbZVTtOdquFt9Q0OpkFe662kY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Z+J7JaSk; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Z+J7JaSk" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-359f35dfef6so126823a91.2 for ; Thu, 19 Mar 2026 22:24:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773984266; x=1774589066; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5+hQyVpTKm3nFclMJjI0dhx1SAb37nEB1biGm9t+4sw=; b=Z+J7JaSkWxc6KUyAMg8J/OrDzX4f+G8f5EcdE43VL2iCJUAsej6YiU3frZQ3RDymPD q6jgQye2nlIVlu1PEqGkRdVECFlk4c7KaZl1Oe1+Ldws77w8oQNOcD3zttiGBM3rrf2r 7s0427Xfa57+hWrB3tY1Kp5NWbGQntPxv9GO17xscPl7GsbHKUKmFtmIdk8XaPHt3SMe gPRRaHbJszeARaL6eMwKFxa0ARWDqBj6O1aM8/NmWAy/+0d8h7++vKxEqyOxIhV8BjoL rweG3eCKmXr0RbMQ+2Nw6n3oVEstcGVxOtkLk9HB+WIRlrtOUrTAal4z8xS3L5erj0nL udfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773984266; x=1774589066; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5+hQyVpTKm3nFclMJjI0dhx1SAb37nEB1biGm9t+4sw=; b=GnprfJ2SWoysSUFdB+zRpDM8XCgNG4imk0gfU221JvHwxlIVThGv8WMpDdtquz9ixY +lmD0jOQW2yA3R14vyVYTbRcUrtJ/INIFYmcqqozciUqIcgXFOTTq/aWYAtttYG4rOOj JaiT6qtDJo0d00daekTw2Yz8iYYek82OfpFmoMSOQhFDE8K4kH4YxhqjmkUO8DONBwr9 0KggGwutcCop9N/zCWFJ0VGs8WzICqTc7/secY00RC5y3+xYK+Dz09rvFIePDMqQ/d1F DoqRTg3RzyLF4lSulWqdVNGk+2wao6z3wFe4mIQ187vvJNHSzfl96rqCLDCsFIPgsUqR sBew== X-Forwarded-Encrypted: i=1; AJvYcCXuUx89BZT+xxwGAfjcXQJhmQDmVO6jWTfzRoP32ALp2Rx6JY05VWofYEt1valUJrjc7k43iqK3vq8GlUI=@vger.kernel.org X-Gm-Message-State: AOJu0YziJhurM5St6W0qCTXyafF+ATs58AhP+gWBCG1hTAebHrjQVDzz /YoBAsvzjYhUEtHUpIX/yml9TKS5iOjkaHif1k+67TsVLZj4WfAUntts X-Gm-Gg: ATEYQzwc2krRpwnDBOt3pckLXrAq7n72TLwhtmnkQ5CO5VYUR29Yjmdb1qXeAlhy5zZ OW5+KN25bF7Ln1jWvT0L9O9FJ/8U/RWIMFAKAgy1zi5XiiajtVNTqJbYRXuu8WFRD+Y3URSmDZP 556GSkuDXqH1KWV3HLQ9HqpUv5uJLnqCYE9H6zVBB0fkgAX3vUjWH39iDlcrfvB+KzvV7kHZbhi B93sp3HEx5hkBxFP9ziRY3fkVcmwXwOAbFj7lCgW9uSPW4Yhxerr6e9sFAWAG2g0G3V/8I5nMMc 4jZc2Er4Gz+k/Y7g4xBrzkmH04gWyGQUWLLRk24XeYshiO+QHLeYx9/wLJIElXtW4XuOnkkbhoI 0EUYkyw579iVbeSIQvbJFPe3NBRUovm5UOff9RW3Zrx4mau5yVZMvj33t1xUaBYCc0zhtlHNx4G q5XiCV5zMkm9F9m6gRPYZqGQc8e4ReXRIPE+I= X-Received: by 2002:a17:90b:3d48:b0:359:fecd:1cd3 with SMTP id 98e67ed59e1d1-35bd2d1cf08mr1189208a91.23.1773984266355; Thu, 19 Mar 2026 22:24:26 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b471:fd0e:76f1:2fa0:b416:4f73]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd40e4bfdsm779344a91.9.2026.03.19.22.24.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 22:24:26 -0700 (PDT) From: Mathura_Kumar To: brauner@kernel.org Cc: academic1mathura@gmail.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk Subject: [PATCH RESEND v2 1/4]IPC: Added New system call do_mq_timedreceive2() for non-destructive peek on posix mqueue Date: Fri, 20 Mar 2026 10:53:35 +0530 Message-ID: <20260320052340.6696-2-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260320052340.6696-1-academic1mathura@gmail.com> References: <20260320052340.6696-1-academic1mathura@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Mathura_Kumar --- include/linux/compat.h | 6 +- include/linux/syscalls.h | 6 + include/uapi/asm-generic/unistd.h | 7 +- include/uapi/linux/mqueue.h | 14 ++- ipc/mqueue.c | 186 ++++++++++++++++++++++++++++-- ipc/msg.c | 2 +- ipc/msgutil.c | 48 ++++---- ipc/util.h | 3 +- kernel/sys_ni.c | 1 + 9 files changed, 231 insertions(+), 42 deletions(-) diff --git a/include/linux/compat.h b/include/linux/compat.h index 56cebaff0c91..9f5ca26e76d8 100644 --- a/include/linux/compat.h +++ b/include/linux/compat.h @@ -22,6 +22,7 @@ #include #include #include +#include =20 #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER /* @@ -801,8 +802,9 @@ asmlinkage long compat_sys_pwritev64v2(unsigned long fd, const struct iovec __user *vec, unsigned long vlen, loff_t pos, rwf_t flags); #endif - - +asmlinkage long compat_sys_mq_timedreceive2(mqd_t mqdes, struct compat_mq_= timedreceive2_args __user *uargs, + unsigned int flags, unsigned long index, + struct old_timespec32 __user *abs_timeout); /* * Deprecated system calls which are still defined in * include/uapi/asm-generic/unistd.h and wanted by >=3D 1 arch diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h index 02bd6ddb6278..993e570c90ab 100644 --- a/include/linux/syscalls.h +++ b/include/linux/syscalls.h @@ -79,6 +79,7 @@ struct mnt_id_req; struct ns_id_req; struct xattr_args; struct file_attr; +struct mq_timedreceive2_args; =20 #include #include @@ -93,6 +94,7 @@ struct file_attr; #include #include #include +#include =20 #ifdef CONFIG_ARCH_HAS_SYSCALL_WRAPPER /* @@ -746,6 +748,10 @@ asmlinkage long sys_mq_timedsend_time32(mqd_t mqdes, const char __user *u_msg_ptr, unsigned int msg_len, unsigned int msg_prio, const struct old_timespec32 __user *u_abs_timeout); +asmlinkage long +sys_mq_timedreceive2(mqd_t mqdes, struct mq_timedreceive2_args __user *uar= gs, + unsigned int flags, unsigned long index, + struct __kernel_timespec __user *abs_timeout); asmlinkage long sys_msgget(key_t key, int msgflg); asmlinkage long sys_old_msgctl(int msqid, int cmd, struct msqid_ds __user = *buf); asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf= ); diff --git a/include/uapi/asm-generic/unistd.h b/include/uapi/asm-generic/u= nistd.h index a627acc8fb5f..200ee7fde5c4 100644 --- a/include/uapi/asm-generic/unistd.h +++ b/include/uapi/asm-generic/unistd.h @@ -863,9 +863,12 @@ __SYSCALL(__NR_listns, sys_listns) #define __NR_rseq_slice_yield 471 __SYSCALL(__NR_rseq_slice_yield, sys_rseq_slice_yield) =20 -#undef __NR_syscalls -#define __NR_syscalls 472 +#define __NR_mq_timedreceive2 472 +__SC_COMP(__NR_mq_timedreceive2, sys_mq_timedreceive2, + compat_sys_mq_timedreceive2) =20 +#undef __NR_syscalls +#define __NR_syscalls 473 /* * 32 bit systems traditionally used different * syscalls for off_t and loff_t arguments, while diff --git a/include/uapi/linux/mqueue.h b/include/uapi/linux/mqueue.h index b516b66840ad..7cdced63f5d2 100644 --- a/include/uapi/linux/mqueue.h +++ b/include/uapi/linux/mqueue.h @@ -18,8 +18,8 @@ =20 #ifndef _LINUX_MQUEUE_H #define _LINUX_MQUEUE_H - #include +#include =20 #define MQ_PRIO_MAX 32768 /* per-uid limit of kernel memory used by mqueue, in bytes */ @@ -33,6 +33,18 @@ struct mq_attr { __kernel_long_t __reserved[4]; /* ignored for input, zeroed for output */ }; =20 +struct mq_timedreceive2_args { + size_t msg_len; + unsigned int *msg_prio; + char *msg_ptr; +}; + +struct compat_mq_timedreceive2_args { + compat_size_t msg_len; + compat_uptr_t msg_prio; + compat_uptr_t msg_ptr; +}; + /* * SIGEV_THREAD implementation: * SIGEV_THREAD must be implemented in user space. If SIGEV_THREAD is pass= ed diff --git a/ipc/mqueue.c b/ipc/mqueue.c index 4798b375972b..78dc414967a2 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -53,6 +53,7 @@ struct mqueue_fs_context { =20 #define SEND 0 #define RECV 1 +#define MQ_PEEK 2 =20 #define STATE_NONE 0 #define STATE_READY 1 @@ -1230,6 +1231,115 @@ static int do_mq_timedreceive(mqd_t mqdes, char __u= ser *u_msg_ptr, return ret; } =20 +static struct msg_msg *mq_peek_index(struct mqueue_inode_info *info, int i= ndex) +{ + struct rb_node *node; + struct posix_msg_tree_node *leaf; + struct msg_msg *msg; + + int count =3D 0; + + /* Start from highest priority */ + node =3D rb_last(&info->msg_tree); + while (node) { + leaf =3D rb_entry(node, struct posix_msg_tree_node, rb_node); + list_for_each_entry(msg, &leaf->msg_list, m_list) { + if (count =3D=3D index) + return msg; + count++; + } + + node =3D rb_prev(node); + } + + return NULL; +} + +static int do_mq_timedreceive2(mqd_t mqdes, struct mq_timedreceive2_args *= args, + unsigned int flags, unsigned long index, + struct timespec64 *ts) +{ + ssize_t ret; + struct msg_msg *msg_ptr, *k_msg_buffer; + long k_m_type; + size_t k_m_ts; + struct inode *inode; + struct mqueue_inode_info *info; + + if (!(flags & MQ_PEEK)) { + return do_mq_timedreceive(mqdes, args->msg_ptr, args->msg_len, + args->msg_prio, ts); + } + audit_mq_sendrecv(mqdes, args->msg_len, 0, ts); + CLASS(fd, f)(mqdes); + if (fd_empty(f)) + return -EBADF; + + inode =3D file_inode(fd_file(f)); + if (unlikely(fd_file(f)->f_op !=3D &mqueue_file_operations)) + return -EBADF; + info =3D MQUEUE_I(inode); + audit_file(fd_file(f)); + + if (unlikely(!(fd_file(f)->f_mode & FMODE_READ))) + return -EBADF; + + if (unlikely(args->msg_len < info->attr.mq_msgsize)) + return -EMSGSIZE; + if (index >=3D (unsigned long)info->attr.mq_maxmsg) + return -ENOENT; + + spin_lock(&info->lock); + if (info->attr.mq_curmsgs =3D=3D 0) { + spin_unlock(&info->lock); + return -EAGAIN; + } + msg_ptr =3D mq_peek_index(info, index); + if (!msg_ptr) { + spin_unlock(&info->lock); + return -ENOENT; + } + k_m_type =3D msg_ptr->m_type; + k_m_ts =3D msg_ptr->m_ts; + spin_unlock(&info->lock); + + k_msg_buffer =3D alloc_msg(k_m_ts); + if (!k_msg_buffer) + return -ENOMEM; + + /* + * Two spin locks are necessary here. We are avoiding atomic memory + * allocation and premature allocation before confirming that + * a message actually exists to peek. + */ + spin_lock(&info->lock); + msg_ptr =3D mq_peek_index(info, index); + if (!msg_ptr || msg_ptr->m_type !=3D k_m_type || + msg_ptr->m_ts !=3D k_m_ts) { + spin_unlock(&info->lock); + free_msg(k_msg_buffer); + return -EAGAIN; + } + if (IS_ERR(copy_msg(msg_ptr, k_msg_buffer, k_m_ts))) { + spin_unlock(&info->lock); + free_msg(k_msg_buffer); + return -EINVAL; + } + spin_unlock(&info->lock); + + ret =3D k_msg_buffer->m_ts; + if (args->msg_prio && put_user(k_m_type, args->msg_prio)) { + free_msg(k_msg_buffer); + return -EFAULT; + } + if (store_msg(args->msg_ptr, k_msg_buffer, k_m_ts)) { + free_msg(k_msg_buffer); + return -EFAULT; + } + free_msg(k_msg_buffer); + return ret; +} + SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr, size_t, msg_len, unsigned int, msg_prio, const struct __kernel_timespec __user *, u_abs_timeout) @@ -1258,6 +1368,27 @@ SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char = __user *, u_msg_ptr, return do_mq_timedreceive(mqdes, u_msg_ptr, msg_len, u_msg_prio, p); } =20 +SYSCALL_DEFINE5(mq_timedreceive2, mqd_t, mqdes, + struct mq_timedreceive2_args __user *, uargs, unsigned int, + flags, const unsigned long, index, + const struct __kernel_timespec __user *, u_abs_timeout) +{ + struct mq_timedreceive2_args args; + struct timespec64 ts, *p =3D NULL; + + if (copy_from_user(&args, uargs, sizeof(args))) + return -EFAULT; + + if (u_abs_timeout) { + int res =3D prepare_timeout(u_abs_timeout, &ts); + + if (res) + return res; + p =3D &ts; + } + return do_mq_timedreceive2(mqdes, &args, flags, index, p); +} + /* * Notes: the case when user wants us to deregister (with NULL as pointer) * and he isn't currently owner of notification, will be silently discarde= d. @@ -1449,6 +1580,17 @@ SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes, return 0; } =20 +#ifdef CONFIG_COMPAT_32BIT_TIME +static int compat_prepare_timeout(const struct old_timespec32 __user *p, + struct timespec64 *ts) +{ + if (get_old_timespec32(ts, p)) + return -EFAULT; + if (!timespec64_valid(ts)) + return -EINVAL; + return 0; +} + #ifdef CONFIG_COMPAT =20 struct compat_mq_attr { @@ -1490,6 +1632,22 @@ static inline int put_compat_mq_attr(const struct mq= _attr *attr, return 0; } =20 +static inline int get_compat_mq_args(struct mq_timedreceive2_args *args, + struct compat_mq_timedreceive2_args __user *uargs) +{ + struct compat_mq_timedreceive2_args v; + + if (copy_from_user(&v, uargs, sizeof(v))) + return -EFAULT; + + memset(args, 0, sizeof(*args)); + args->msg_len =3D (size_t)v.msg_len; + args->msg_prio =3D (unsigned int *)compat_ptr(v.msg_prio); + args->msg_ptr =3D (char *)compat_ptr(v.msg_ptr); + + return 0; +} + COMPAT_SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, compat_mode_t, mode, struct compat_mq_attr __user *, u_attr) @@ -1541,19 +1699,30 @@ COMPAT_SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes, return -EFAULT; return 0; } -#endif =20 -#ifdef CONFIG_COMPAT_32BIT_TIME -static int compat_prepare_timeout(const struct old_timespec32 __user *p, - struct timespec64 *ts) +COMPAT_SYSCALL_DEFINE5(mq_timedreceive2, mqd_t, mqdes, + struct compat_mq_timedreceive2_args __user *, uargs, + unsigned int, flags, const unsigned long, index, + const struct old_timespec32 __user *, u_abs_timeout) { - if (get_old_timespec32(ts, p)) + struct mq_timedreceive2_args args; + struct timespec64 ts, *p =3D NULL; + + if (get_compat_mq_args(&args, uargs)) return -EFAULT; - if (!timespec64_valid(ts)) - return -EINVAL; - return 0; + + if (u_abs_timeout) { + int res =3D compat_prepare_timeout(u_abs_timeout, &ts); + + if (res) + return res; + p =3D &ts; + } + return do_mq_timedreceive2(mqdes, &args, flags, index, p); } =20 +#endif + SYSCALL_DEFINE5(mq_timedsend_time32, mqd_t, mqdes, const char __user *, u_msg_ptr, unsigned int, msg_len, unsigned int, msg_prio, @@ -1583,6 +1752,7 @@ SYSCALL_DEFINE5(mq_timedreceive_time32, mqd_t, mqdes, } return do_mq_timedreceive(mqdes, u_msg_ptr, msg_len, u_msg_prio, p); } + #endif =20 static const struct inode_operations mqueue_dir_inode_operations =3D { diff --git a/ipc/msg.c b/ipc/msg.c index 62996b97f0ac..6392b11dd7f7 100644 --- a/ipc/msg.c +++ b/ipc/msg.c @@ -1156,7 +1156,7 @@ static long do_msgrcv(int msqid, void __user *buf, si= ze_t bufsz, long msgtyp, in * not update queue parameters. */ if (msgflg & MSG_COPY) { - msg =3D copy_msg(msg, copy); + msg =3D copy_msg(msg, copy, msg->m_ts); goto out_unlock0; } =20 diff --git a/ipc/msgutil.c b/ipc/msgutil.c index e28f0cecb2ec..c5536ce47cc2 100644 --- a/ipc/msgutil.c +++ b/ipc/msgutil.c @@ -51,7 +51,7 @@ static int __init init_msg_buckets(void) } subsys_initcall(init_msg_buckets); =20 -static struct msg_msg *alloc_msg(size_t len) +struct msg_msg *alloc_msg(size_t len) { struct msg_msg *msg; struct msg_msgseg **pseg; @@ -122,39 +122,33 @@ struct msg_msg *load_msg(const void __user *src, size= _t len) free_msg(msg); return ERR_PTR(err); } -#ifdef CONFIG_CHECKPOINT_RESTORE -struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst) + +struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst, size_t = len) { - struct msg_msgseg *dst_pseg, *src_pseg; - size_t len =3D src->m_ts; - size_t alen; + struct msg_msgseg *src_seg, *dst_seg; + size_t remaining, chunk; =20 - if (src->m_ts > dst->m_ts) + if (len > src->m_ts) return ERR_PTR(-EINVAL); - - alen =3D min(len, DATALEN_MSG); - memcpy(dst + 1, src + 1, alen); - - for (dst_pseg =3D dst->next, src_pseg =3D src->next; - src_pseg !=3D NULL; - dst_pseg =3D dst_pseg->next, src_pseg =3D src_pseg->next) { - - len -=3D alen; - alen =3D min(len, DATALEN_SEG); - memcpy(dst_pseg + 1, src_pseg + 1, alen); + chunk =3D min(len, DATALEN_MSG); + memcpy(dst + 1, src + 1, chunk); + remaining =3D len - chunk; + src_seg =3D src->next; + dst_seg =3D dst->next; + while (remaining > 0 && src_seg && dst_seg) { + chunk =3D min(remaining, DATALEN_SEG); + memcpy(dst_seg + 1, src_seg + 1, chunk); + remaining -=3D chunk; + src_seg =3D src_seg->next; + dst_seg =3D dst_seg->next; } - + if (remaining !=3D 0) + return ERR_PTR(-EINVAL); dst->m_type =3D src->m_type; - dst->m_ts =3D src->m_ts; - + dst->m_ts =3D src->m_ts; return dst; } -#else -struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst) -{ - return ERR_PTR(-ENOSYS); -} -#endif + int store_msg(void __user *dest, struct msg_msg *msg, size_t len) { size_t alen; diff --git a/ipc/util.h b/ipc/util.h index a55d6cebe6d3..374abeee79b3 100644 --- a/ipc/util.h +++ b/ipc/util.h @@ -197,8 +197,9 @@ int ipc_parse_version(int *cmd); =20 extern void free_msg(struct msg_msg *msg); extern struct msg_msg *load_msg(const void __user *src, size_t len); -extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst); +extern struct msg_msg *copy_msg(struct msg_msg *src, struct msg_msg *dst, = size_t len); extern int store_msg(void __user *dest, struct msg_msg *msg, size_t len); +extern struct msg_msg *alloc_msg(size_t len); =20 static inline int ipc_checkid(struct kern_ipc_perm *ipcp, int id) { diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c index add3032da16f..658d6b8274b3 100644 --- a/kernel/sys_ni.c +++ b/kernel/sys_ni.c @@ -391,6 +391,7 @@ COND_SYSCALL(setuid16); /* restartable sequence */ COND_SYSCALL(rseq); COND_SYSCALL(rseq_slice_yield); +COND_SYSCALL(mq_timedreceive2); =20 COND_SYSCALL(uretprobe); COND_SYSCALL(uprobe); --=20 2.43.0 From nobody Mon Apr 6 09:10:55 2026 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9FCA2E11DC for ; Fri, 20 Mar 2026 05:24:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984274; cv=none; b=Yo6ObBB0Q4w3+3sF9uF02o+qM+/Q94TOyTvzxgQZrAxdDq+zKoM6jaWDtiCIa80wJv8ct/iawQG0qHNRByzqDFh/Zo2eirW4k7xPmeyWZCAf2/6F3tF7farkaOpgEhBxgxKRYw+U9j/3S1EbQMvga1Occ8LhV8nFImMxxcIMQT8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984274; c=relaxed/simple; bh=goBBsTk2MYrix5HgSc5P3EgwATIoXdXN56gmrYzwOzE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l20fQxyziMREgbl/NEVHjFAzE8VDIM5JpzYDM5bBovkPoTXNEaPJxJD5UwZCQbWfgCT3NfXfZ7uPSlcfltV6TBpYWBPgehl5JaAVTEvAkwd0xdO/9K1Y8dZh8x8Fu00jgBSXUnXxKIlih8RD1R65pnxIDKrqyvvF3SRiMusO960= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nCEkLMi+; arc=none smtp.client-ip=209.85.216.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nCEkLMi+" Received: by mail-pj1-f50.google.com with SMTP id 98e67ed59e1d1-3590042fa8eso1148050a91.1 for ; Thu, 19 Mar 2026 22:24:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773984272; x=1774589072; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zRg3BT7wnf4d3IQRMTP80BQdnBv6rSRlNe79T3b3Rvs=; b=nCEkLMi+jDbbNvUJzkuxo57/VjPiIc+FpFAn9t5geai+MJsvGDUM01HCwSbhm+9hTo eRSz1h4/IL/Cs5NW5PJOJB1R52Ryy1zay2h5GRgSQj9TWdgFB9O7+u0Yik+TZ2QAdiF1 AAl4vTHBe0SBnZocomKjg5IlfSu85vBzYdY8Fowy48XIzn1cmjM12Yb2UpI0QWfN2qmw /E+qE+YXRLtnXCRiCyjFl4gSrpY1eLyJ/JAhzbCil+aMEkao6w02E04bL4vaczm7lElm GklLxd+9nI3MBFRJmrVKozr29nAWIpP1Sjlt/bFPfEEdUKa6XItQa0UC8RP5W61Mu7g/ M/hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773984272; x=1774589072; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zRg3BT7wnf4d3IQRMTP80BQdnBv6rSRlNe79T3b3Rvs=; b=smWG4Yp6wAQcA85KjCxFi38xNbF+PzncYOOV5kF3KhZdDaj4rmx87mmyJqd0jjWVng 0sljok+CKMJr2YrKSX6CcseWuibKQOyUsr5sZN0w4P2IJmkYLAFa8e3xpi16sFhyqSJ7 piMhroGPwfagVe85PDdKltyRIcpl3jNhHVCaETARrUBvXasJxKMtn2tmNDeg4ZeTjtvR Ohzg3DKKV0G8m2wtAcFO+pWQHGutsYvn6ejiCBhsdWZ8ldn/kO03IJvPo2EboxOQMoSS AdJ1kUIsMd2tERfQjy/aHqi+Igm7v4XKdghjNigUyh3hekJuK5QDtWJG1nuBkGW6Z80C ybhQ== X-Forwarded-Encrypted: i=1; AJvYcCWLZ/l0Ehh17/TpyR2OAGNEzBm76Yrem8Q5l/X+Bj6Sl9dOgyrUrGQS7vAPM2wL2boD4nFssOsEDBjhGN4=@vger.kernel.org X-Gm-Message-State: AOJu0YyOhpbXouPwLhU9qBPOzLA4G+emhavUKHMLTbnRhg/HN620vGoK +I6fUBi4B2YnsOsYi954CU4KaVVQwZWPthq8J0HPKle08Q0uVPqFXgyOurSTUg== X-Gm-Gg: ATEYQzxiMoOeTCt7KsLrlw4IeALt7EdqfCgLQkTcvZXefeWtPQhp41s+NxAfX1HKWbO zKTdRlbnVJb0PasWeFCSC/S4rC8BHtdtjGrQAapOzXSWZ+hirkWZP0KCbI/CR/pMAnkMxC+Rmgb 3spPp692M+r2zhQphf0iIy6/UEl6NihajFVkPLHQH73RwTYrGvlx+0YdEnE8v2OlqwTW4SvhFv1 eMoef0adlYbt3kXGKNpjQf5JPVK5BSsLYC7KRgzylbGXrgv7hubRFHdLdG5ArSOltptf+cWPv1O jQUjj3qNCkLP2UvVb6QENOlavG0c9XI5OPVMqOYxCMQxCzf+rQ0Ame2g26UY5aTq5B9eEPahlEo jC3yRkwfpTURRkQNbk+v3sCSLbt864PtWYtDZg9r2JEaAVqlESt9AM9P9vNQPxpdn21/ZScs5aJ VmoK7Y7rJ/3mbg5/BgSPBOefT3CrEyCMx5B94= X-Received: by 2002:a17:90b:17ce:b0:35a:cf:64a6 with SMTP id 98e67ed59e1d1-35bd2cee711mr1233840a91.23.1773984272179; Thu, 19 Mar 2026 22:24:32 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b471:fd0e:76f1:2fa0:b416:4f73]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd40e4bfdsm779344a91.9.2026.03.19.22.24.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 22:24:31 -0700 (PDT) From: Mathura_Kumar To: brauner@kernel.org Cc: academic1mathura@gmail.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk Subject: [PATCH RESEND v2 2/4]IPC: Added system call number in all most common arch. Date: Fri, 20 Mar 2026 10:53:36 +0530 Message-ID: <20260320052340.6696-3-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260320052340.6696-1-academic1mathura@gmail.com> References: <20260320052340.6696-1-academic1mathura@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Mathura_Kumar --- arch/alpha/kernel/syscalls/syscall.tbl | 1 + arch/arm/tools/syscall.tbl | 1 + arch/arm64/tools/syscall_32.tbl | 1 + arch/m68k/kernel/syscalls/syscall.tbl | 1 + arch/microblaze/kernel/syscalls/syscall.tbl | 1 + arch/mips/kernel/syscalls/syscall_n32.tbl | 1 + arch/mips/kernel/syscalls/syscall_n64.tbl | 1 + arch/mips/kernel/syscalls/syscall_o32.tbl | 1 + arch/parisc/kernel/syscalls/syscall.tbl | 1 + arch/powerpc/kernel/syscalls/syscall.tbl | 1 + arch/s390/kernel/syscalls/syscall.tbl | 1 + arch/sh/kernel/syscalls/syscall.tbl | 1 + arch/sparc/kernel/syscalls/syscall.tbl | 1 + arch/x86/entry/syscalls/syscall_32.tbl | 1 + arch/x86/entry/syscalls/syscall_64.tbl | 1 + arch/xtensa/kernel/syscalls/syscall.tbl | 1 + scripts/syscall.tbl | 1 + 17 files changed, 17 insertions(+) diff --git a/arch/alpha/kernel/syscalls/syscall.tbl b/arch/alpha/kernel/sys= calls/syscall.tbl index f31b7afffc34..0ff42d241419 100644 --- a/arch/alpha/kernel/syscalls/syscall.tbl +++ b/arch/alpha/kernel/syscalls/syscall.tbl @@ -511,3 +511,4 @@ 579 common file_setattr sys_file_setattr 580 common listns sys_listns 581 common rseq_slice_yield sys_rseq_slice_yield +582 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/arm/tools/syscall.tbl b/arch/arm/tools/syscall.tbl index 94351e22bfcf..c00a185fbe50 100644 --- a/arch/arm/tools/syscall.tbl +++ b/arch/arm/tools/syscall.tbl @@ -486,3 +486,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_t= imedreceive2 diff --git a/arch/arm64/tools/syscall_32.tbl b/arch/arm64/tools/syscall_32.= tbl index 62d93d88e0fe..4eac85c25658 100644 --- a/arch/arm64/tools/syscall_32.tbl +++ b/arch/arm64/tools/syscall_32.tbl @@ -483,3 +483,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timed= receive2 diff --git a/arch/m68k/kernel/syscalls/syscall.tbl b/arch/m68k/kernel/sysca= lls/syscall.tbl index 248934257101..6e336289eaf4 100644 --- a/arch/m68k/kernel/syscalls/syscall.tbl +++ b/arch/m68k/kernel/syscalls/syscall.tbl @@ -471,3 +471,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/microblaze/kernel/syscalls/syscall.tbl b/arch/microblaze/= kernel/syscalls/syscall.tbl index 223d26303627..6b617de0442e 100644 --- a/arch/microblaze/kernel/syscalls/syscall.tbl +++ b/arch/microblaze/kernel/syscalls/syscall.tbl @@ -477,3 +477,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/mips/kernel/syscalls/syscall_n32.tbl b/arch/mips/kernel/s= yscalls/syscall_n32.tbl index 7430714e2b8f..1f761cf9cfb0 100644 --- a/arch/mips/kernel/syscalls/syscall_n32.tbl +++ b/arch/mips/kernel/syscalls/syscall_n32.tbl @@ -410,3 +410,4 @@ 469 n32 file_setattr sys_file_setattr 470 n32 listns sys_listns 471 n32 rseq_slice_yield sys_rseq_slice_yield +472 n32 mq_timedreceive2 compat_sys_mq_timedreceive2 diff --git a/arch/mips/kernel/syscalls/syscall_n64.tbl b/arch/mips/kernel/s= yscalls/syscall_n64.tbl index 630aab9e5425..75de6ee2df94 100644 --- a/arch/mips/kernel/syscalls/syscall_n64.tbl +++ b/arch/mips/kernel/syscalls/syscall_n64.tbl @@ -386,3 +386,4 @@ 469 n64 file_setattr sys_file_setattr 470 n64 listns sys_listns 471 n64 rseq_slice_yield sys_rseq_slice_yield +472 n64 mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/mips/kernel/syscalls/syscall_o32.tbl b/arch/mips/kernel/s= yscalls/syscall_o32.tbl index 128653112284..f11be7e34d93 100644 --- a/arch/mips/kernel/syscalls/syscall_o32.tbl +++ b/arch/mips/kernel/syscalls/syscall_o32.tbl @@ -459,3 +459,4 @@ 469 o32 file_setattr sys_file_setattr 470 o32 listns sys_listns 471 o32 rseq_slice_yield sys_rseq_slice_yield +472 o32 mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedreceive2 diff --git a/arch/parisc/kernel/syscalls/syscall.tbl b/arch/parisc/kernel/s= yscalls/syscall.tbl index f6e2d0379d57..1b22b8d0edcc 100644 --- a/arch/parisc/kernel/syscalls/syscall.tbl +++ b/arch/parisc/kernel/syscalls/syscall.tbl @@ -470,3 +470,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel= /syscalls/syscall.tbl index 4fcc7c58a105..ab57aa18b24a 100644 --- a/arch/powerpc/kernel/syscalls/syscall.tbl +++ b/arch/powerpc/kernel/syscalls/syscall.tbl @@ -562,3 +562,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 nospu rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedreceiv= e2 \ No newline at end of file diff --git a/arch/s390/kernel/syscalls/syscall.tbl b/arch/s390/kernel/sysca= lls/syscall.tbl index 09a7ef04d979..34df682061d9 100644 --- a/arch/s390/kernel/syscalls/syscall.tbl +++ b/arch/s390/kernel/syscalls/syscall.tbl @@ -398,3 +398,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/sh/kernel/syscalls/syscall.tbl b/arch/sh/kernel/syscalls/= syscall.tbl index 70b315cbe710..cac787dbef1a 100644 --- a/arch/sh/kernel/syscalls/syscall.tbl +++ b/arch/sh/kernel/syscalls/syscall.tbl @@ -475,3 +475,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/sparc/kernel/syscalls/syscall.tbl b/arch/sparc/kernel/sys= calls/syscall.tbl index 7e71bf7fcd14..06bcea3622cb 100644 --- a/arch/sparc/kernel/syscalls/syscall.tbl +++ b/arch/sparc/kernel/syscalls/syscall.tbl @@ -517,3 +517,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedreceiv= e2 \ No newline at end of file diff --git a/arch/x86/entry/syscalls/syscall_32.tbl b/arch/x86/entry/syscal= ls/syscall_32.tbl index f832ebd2d79b..79154690058f 100644 --- a/arch/x86/entry/syscalls/syscall_32.tbl +++ b/arch/x86/entry/syscalls/syscall_32.tbl @@ -477,3 +477,4 @@ 469 i386 file_setattr sys_file_setattr 470 i386 listns sys_listns 471 i386 rseq_slice_yield sys_rseq_slice_yield +472 i386 mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedreceive2 diff --git a/arch/x86/entry/syscalls/syscall_64.tbl b/arch/x86/entry/syscal= ls/syscall_64.tbl index 524155d655da..a76f9a2f043a 100644 --- a/arch/x86/entry/syscalls/syscall_64.tbl +++ b/arch/x86/entry/syscalls/syscall_64.tbl @@ -441,3 +441,4 @@ 547 x32 pwritev2 compat_sys_pwritev64v2 # This is the end of the legacy x32 range. Numbers 548 and above are # not special and are not to be used for x32-specific syscalls. +548 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/arch/xtensa/kernel/syscalls/syscall.tbl b/arch/xtensa/kernel/s= yscalls/syscall.tbl index a9bca4e484de..ae106ac97418 100644 --- a/arch/xtensa/kernel/syscalls/syscall.tbl +++ b/arch/xtensa/kernel/syscalls/syscall.tbl @@ -442,3 +442,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/scripts/syscall.tbl b/scripts/syscall.tbl index 7a42b32b6577..282bfff83d59 100644 --- a/scripts/syscall.tbl +++ b/scripts/syscall.tbl @@ -412,3 +412,4 @@ 469 common file_setattr sys_file_setattr 470 common listns sys_listns 471 common rseq_slice_yield sys_rseq_slice_yield +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 --=20 2.43.0 From nobody Mon Apr 6 09:10:55 2026 Received: from mail-pj1-f42.google.com (mail-pj1-f42.google.com [209.85.216.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 245E12E8B67 for ; Fri, 20 Mar 2026 05:24:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984284; cv=none; b=LDCOTfBU1OAciZBYRECiqRnbhuucQ1j30MlWPtYtT32h1qadiRqvPJEHrOqVe62mbwyBf/yyOiXW9HFiGnooHD2pFdqdIlRnfvaXbdiWDeV++OZ9FGFhs14aU52pj/OczrBUPo/FXjwbHzfPondQ1nb2A8w3nV9BHtj3Xa81gz4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984284; c=relaxed/simple; bh=/DeFAgUlo+qfAIACLhOuCQe8PHw7H0K7rpvGU0P4cFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=FK64Y04WwKTAmL8fczS9cv95C5/+DvMlEkGEjZ3GKhzF+IM14IZ37Xadac9tdAicFIFupYcFMKME4ikUtFbm3TNgUtsS9shldDUI6duKAfQnisjJkiYimfhl2+aaoofCGo4nldenxxm3JQn2ceyEDRitKQRfv0L0F13NYfkOwrI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QzZz4D3d; arc=none smtp.client-ip=209.85.216.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QzZz4D3d" Received: by mail-pj1-f42.google.com with SMTP id 98e67ed59e1d1-35a1d4a095bso944683a91.0 for ; Thu, 19 Mar 2026 22:24:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773984281; x=1774589081; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/F6J/Pk6HOeSdS86B2FiCbfUiuBicwWuCfGXC04QbhQ=; b=QzZz4D3dhwmBXMu/w7kJMtAx97adTGBAVYUwsg7sCQ7WBggY9n4cxvGGrZFbyzpKtG wUGWEn+5l+EN5+7ggTpyxzYwAqzMTEMlkUs1WWPsTexVH4lt2MwDnZ2LktMdC8To0KOW 6fv2y7YJOlDJXj6bimHStAeb/p+SzlqxKnjN/m7fHkuafHtoZiciksKQZLK+KpmMlsXZ fp/5xYhh4ShmqyhuV0C605jRwMK4NBcccPaOWgQ/nIV39nza+5v02f6jSi49x+8IDPVH Doo9We4Yt5DVysHEL7/IBgYDdI1i+8HF4pF5d3hJxBfbPNFrmPjBz7j8LlcyHXE0PPih Ultg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773984281; x=1774589081; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=/F6J/Pk6HOeSdS86B2FiCbfUiuBicwWuCfGXC04QbhQ=; b=NV343KPZ1RWPR1tmTqs+SqUqXKoi2HcXVxacPebx7yQIsV9Sr7yHFwjnepQ70hjsRz 02q9qC8ugLVPhf9UQ/O5v2S+UB1FirzZoOA0FhFyAREcRLHU7eUsHO67j/cxO6gjvf8N boXzqWJp+Dh8wQ8qj38rv6HuVtHdc42rGFbFKNWwHjui5hJNN6KYmU3VXB+qVtyc2Y20 HatYKo6jdZ1uCNHGm3+iR2uNbp8V5SIn6RWpd6PBpf2fH2xOLCuu1Mcqb9cR38e/GZHg ckmF0kPuRRTPokNsXtiB8EAVtAoMe2yXTGqAKenaiFhbbgUUSXNML9OTMeL8/bszaYSW RB4w== X-Forwarded-Encrypted: i=1; AJvYcCXVjKRI1TsUohDqfpfu6nsmZ//tdBOkpvElK7CE7xkx1GGNPlDix32mIEyp8gT8fck9GbKQJ13+5Hb7U0Y=@vger.kernel.org X-Gm-Message-State: AOJu0Yza0Dn/nAuc9NweGcpdisG7w8y6vrUzQ++Drh+APtsbFSpc+3bF kGn3pOseRMIY51CntsCzNVmYES8xpargp7XeD4oic3mIiU+DBe40JlS5CuD2rQ== X-Gm-Gg: ATEYQzwWaFKGEGOiDbiuZ/HMfGn4F3e2g0Qa98FLQyS1mrHGTx9nwUYMFnQxKVdGDYv L51y93wJyykfJcyjasjeOiGNOpzxt6Rx+vhMtPITowHOgcGTXM/e3euNuQfKVzkQZjuER77j5yc JVPp8DJRWG61qurGDXo3X5IQq3ITBxSbBenf8Tr6RpQR4jaFQjDKH1WWCEwq6GIgZQYvbu7LbJm wnttRmVMBeTMBtyALk5tlBkSW6JpqN0SViGw4KoU9M8P5/m8Iycvr2nPZF8LPconY45tA++27fA UvmekXhv/yXXwXoyGFrYy3tBl1D8j4u009gGiW5asrTfS+v02V963yAjik/Q41ptYbO6ZQG3uR+ 8Aseki0KH3b/RDE6XG1kY5bsDwFDLF3zxqz0illqOfX3zlVfgDQIAcxokL8Td811mBnkB2OXjBD pBHrw2K8PIA2C6DGpHe0oXeBzw74Ou8TYgbI2gsE1hYxA7QQ== X-Received: by 2002:a17:90a:dfd0:b0:35a:117:9521 with SMTP id 98e67ed59e1d1-35bd27cb0bemr1281499a91.10.1773984281258; Thu, 19 Mar 2026 22:24:41 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b471:fd0e:76f1:2fa0:b416:4f73]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd40e4bfdsm779344a91.9.2026.03.19.22.24.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 22:24:40 -0700 (PDT) From: Mathura_Kumar To: brauner@kernel.org Cc: academic1mathura@gmail.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk Subject: [PATCH RESEND v2 3/4]IPC: Prepared Documentation and test Date: Fri, 20 Mar 2026 10:53:37 +0530 Message-ID: <20260320052340.6696-4-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260320052340.6696-1-academic1mathura@gmail.com> References: <20260320052340.6696-1-academic1mathura@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Signed-off-by: Mathura_Kumar --- Documentation/userspace-api/index.rst | 1 + Documentation/userspace-api/ipc.rst | 222 +++++++ tools/testing/selftests/ipc/.gitignore | 1 + tools/testing/selftests/ipc/Makefile | 9 +- tools/testing/selftests/ipc/mq_peek.c | 785 +++++++++++++++++++++++++ 5 files changed, 1017 insertions(+), 1 deletion(-) create mode 100644 Documentation/userspace-api/ipc.rst create mode 100644 tools/testing/selftests/ipc/mq_peek.c diff --git a/Documentation/userspace-api/index.rst b/Documentation/userspac= e-api/index.rst index a68b1bea57a8..bf747a91e74a 100644 --- a/Documentation/userspace-api/index.rst +++ b/Documentation/userspace-api/index.rst @@ -22,6 +22,7 @@ System calls ioctl/index mseal rseq + ipc =20 Security-related interfaces =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D diff --git a/Documentation/userspace-api/ipc.rst b/Documentation/userspace-= api/ipc.rst new file mode 100644 index 000000000000..14a5f0ce7230 --- /dev/null +++ b/Documentation/userspace-api/ipc.rst @@ -0,0 +1,222 @@ +mq_timedreceive2 system call +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D + +This document describes the mq_timedreceive2() system call. It provides +an overview of the feature, interface specification, design, and +test specification. + +Contents +-------- + + 1) Overview + 2) Functional Specification + 3) Design + 4) Implementation Notes + 5) Test Specification + +1) Overview +----------- + +POSIX message queues on Linux provide mq_timedreceive() for consuming +messages from a queue.This interface requires the caller to pass the +message buffer, length and priority pointer as individual arguments to +the system call. This imposes a fixed calling convention that cannot be +extended without breaking the ABI. + +mq_timedreceive2() introduces a new system call entry point that accepts +message buffer parameters via a struct argument rather than as individual +syscall arguments. This frees the remaining syscall argument slots for +new functionality flags and a message index, enabling non-destructive +peek and indexed access semantics that are not possible with the +original interface. + +One 64-bit variant is provided with compat handling: + mq_timedreceive2() + +2) Functional Specification +--------------------------- + +NAME + mq_timedreceive2 - receive or peek at a message from a + POSIX message queue + +SYNOPSIS + +.. code-block:: c + + #include + + struct mq_timedreceive2_args { + size_t msg_len; + unsigned int *msg_prio; + char *msg_ptr; + }; + + ssize_t mq_timedreceive2(mqd_t mqdes, + struct mq_timedreceive2_args *uargs, + unsigned int flags, + unsigned long index, + const struct timespec *abs_timeout); + +Note: No glibc wrapper exists for this syscall. Callers must invoke it +directly using syscall(2). + +DESCRIPTION + mq_timedreceive2() receives or peeks at a message from the + message queue referred to by the descriptor mqdes. + + The uargs structure provides the message buffer parameters: + + ``msg_ptr`` + Userspace buffer to receive the message body. + + ``msg_len`` + Size of msg_ptr in bytes. Must be greater than or equal + to the mq_msgsize attribute of the queue. + + ``msg_prio`` + If not NULL, the priority of the received message is + stored here. + + The flags argument controls receive behavior. The following + flag is defined: + + ``MQ_PEEK`` + Copy the message into msg_ptr without removing it from + the queue. The queue is not modified. If this flag is + not set, behavior is identical to mq_timedreceive() and + the message is consumed. + + The index argument selects which message to operate on within + the priority-ordered queue. index 0 refers to the highest + priority message. When MQ_PEEK is not set, index is ignored + but must be non-empty. + + The abs_timeout argument specifies an absolute timeout. When + MQ_PEEK is set, abs_timeout is ignored since peek is a + non-blocking snapshot operation. When MQ_PEEK is not set, + abs_timeout behaves identically to mq_timedreceive(). + +RETURN VALUE + On success, returns the number of bytes copied into msg_ptr. + On failure, returns -1 and sets errno. + +ERRORS + ``EAGAIN`` + Queue is empty and MQ_PEEK is set. Peek is always + non-blocking and returns immediately on empty queue. + + ``EBADF`` + mqdes is not a valid message queue descriptor open + for reading. + + ``EFAULT`` + uargs, msg_ptr, msg_prio, or abs_timeout points to + an invalid address. + + ``EINVAL`` + flags contains an unknown value, or index is nonzero + and MQ_PEEK is not set. + + ``EMSGSIZE`` + msg_len is less than the mq_msgsize attribute of + the queue. + + ``ETIMEDOUT`` + Pop path only. The call timed out before a message + became available. Never returned on peek path. + +3) Design +--------- + +3.1 Struct-based argument passing +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The message buffer parameters (msg_ptr, msg_len, msg_prio) are +consolidated into struct mq_timedreceive2_args rather than passed +as individual syscall arguments. Due to limited six arguments, +The original mq_timedreceive() consumes all six slots, +leaving no room for extension. Consolidating the buffer parameters +into a struct recovers two argument slots for flags and index while +keeping the interface clean and forward-compatible. + +Future extensions can be made by adding new flag bits without +requiring a new syscall number. + +3.2 Compat handling +~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + struct compat_mq_timedreceive2_args { + compat_size_t msg_len; + compat_uptr_t msg_prio; + compat_uptr_t msg_ptr; + }; + +The compat entry point performs the necessary conversions before +calling the shared do_mq_timedreceive2() implementation. + +3.3 Peek implementation +~~~~~~~~~~~~~~~~~~~~~~~~ + +When MQ_PEEK is set, the implementation locates the target message +in the priority tree but does not remove it. Two locks are taken: +the first confirms a message exists before any allocation is +attempted, avoiding allocation on empty queues. The second protects +the kernel temporary buffer copy operation. The message is copied to +userspace and both locks are released with the queue unmodified. + +3.4 Index argument +~~~~~~~~~~~~~~~~~~~ + +The priority tree is walked to the node at position index within +the priority ordering. index 0 is always the highest priority +message, consistent with what an unconditional mq_timedreceive() +would return. + +4) Implementation Notes +----------------------- + +The implementation lives in ipc/mqueue.c. The syscall entry +point mq_timedreceive2 are thin wrappers that validate and convert +arguments before calling the shared internal function do_mq_timedreceive2(= ). + +Syscall numbers are assigned for all of most common architectures. Refer +to the respective syscall table files under arch/ for per-architecture +numbers. + +5) Test Specification +--------------------- + +Tests for mq_timedreceive2() should cover the following: + +1) Basic receive: verify that without MQ_PEEK the message is consumed + and queue depth decreases by one. Verify message body and priority + are correct. + +2) Peek semantics: verify that with MQ_PEEK the message body and + priority are returned correctly and the queue depth is unchanged + after the call. + +3) Repeated peek: verify that calling mq_timedreceive2() with MQ_PEEK + multiple times on the same queue returns the same message each time + without modifying the queue. + +4) Index argument: verify that index 0 returns the highest priority + message. Verify that out-of-range index returns ENOENT. + +5) Empty queue: verify that peek on an empty queue returns EAGAIN + immediately without blocking. + +6) Memory behavior: verify that both small and large message copies + work correctly without corruption. + +7) Invalid arguments: verify EBADF for invalid mqdes, EFAULT for bad + pointers in uargs, EINVAL for unknown flags, EMSGSIZE for msg_len + smaller than queue mq_msgsize. + +8) Concurrent access: verify that simultaneous peek from multiple + threads returns consistent results and does not corrupt queue + state. Verify that a concurrent mq_receive() and mq_peek() do + not race. diff --git a/tools/testing/selftests/ipc/.gitignore b/tools/testing/selftes= ts/ipc/.gitignore index 9ed280e4c704..fe609d98ecb2 100644 --- a/tools/testing/selftests/ipc/.gitignore +++ b/tools/testing/selftests/ipc/.gitignore @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only msgque_test msgque +mq_peek diff --git a/tools/testing/selftests/ipc/Makefile b/tools/testing/selftests= /ipc/Makefile index 50e9c299fc4a..1a8b27127ca8 100644 --- a/tools/testing/selftests/ipc/Makefile +++ b/tools/testing/selftests/ipc/Makefile @@ -1,6 +1,8 @@ # SPDX-License-Identifier: GPL-2.0 uname_M :=3D $(shell uname -m 2>/dev/null || echo not) ARCH ?=3D $(shell echo $(uname_M) | sed -e s/i.86/i386/) +CC =3D gcc +CFLAGS =3D -static -O2 ifeq ($(ARCH),i386) ARCH :=3D x86 CFLAGS :=3D -DCONFIG_X86_32 -D__i386__ @@ -9,10 +11,15 @@ ifeq ($(ARCH),x86_64) ARCH :=3D x86 CFLAGS :=3D -DCONFIG_X86_64 -D__x86_64__ endif +ifeq ($(ARCH),aarch64) + ARCH :=3D arm64 + CFLAGS :=3D -DCONFIG_ARM64 +endif =20 CFLAGS +=3D $(KHDR_INCLUDES) =20 -TEST_GEN_PROGS :=3D msgque +TEST_GEN_PROGS :=3D msgque mq_peek +LDLIBS +=3D -lrt -lpthread =20 include ../lib.mk =20 diff --git a/tools/testing/selftests/ipc/mq_peek.c b/tools/testing/selftest= s/ipc/mq_peek.c new file mode 100644 index 000000000000..d08596ae6e1c --- /dev/null +++ b/tools/testing/selftests/ipc/mq_peek.c @@ -0,0 +1,785 @@ +// SPDX-License-Identifier: GPL-2.0 + +/* - Correct priority-rank indexed access (index 0 =3D highest priority) + * - FIFO ordering within same priority level + * - Concurrent peek + receive / peek + send races + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mqueue.h" +#include "kselftest.h" +#include "linux/types.h" + +#ifndef __NR_mq_timedreceive2 + +#if defined(__alpha__) +#define __NR_mq_timedreceive2 582 + +#elif defined(__x86_64__) +#define __NR_mq_timedreceive2 548 + +#else +/* common value used by many architectures: + * arm m68k, microblaze, mips + * parisc, x86_32, and others + */ +#define __NR_mq_timedreceive2 472 + +#endif +#endif + +#define MQ_PEEK 2U + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#endif + +struct mq_timedreceive2_args { + size_t msg_len; + unsigned int *msg_prio; + char *msg_ptr; +}; + +static long mq_timedreceive2(mqd_t mqdes, struct mq_timedreceive2_args *ua= rgs, + unsigned int flags, unsigned long index, + const struct timespec *timeout) +{ + return syscall(__NR_mq_timedreceive2, (long)mqdes, uargs, (long)flags, + index, timeout); +} + +#define MQ_NAME_PREFIX "/mq_peek_test_" +#define MAX_MSG_SIZE 128 +#define LARGE_MSG_SIZE 4064 +#define MQ_MAXMSG 16 + +#define PRIO_HIGH 9 +#define PRIO_MED 5 +#define PRIO_LOW 1 + +static mqd_t open_queue(const char *suffix, long msgsize) +{ + char name[64]; + struct mq_attr attr =3D { + .mq_flags =3D 0, + .mq_maxmsg =3D MQ_MAXMSG, + .mq_msgsize =3D msgsize, + .mq_curmsgs =3D 0, + }; + mqd_t mqd; + + snprintf(name, sizeof(name), "%s%s", MQ_NAME_PREFIX, suffix); + mq_unlink(name); + + mqd =3D mq_open(name, O_NONBLOCK | O_RDWR | O_CREAT | O_EXCL, 0600, &attr= ); + if (mqd =3D=3D (mqd_t)-1) { + ksft_test_result_fail("mq_open(%s): %m\n", name); + ksft_exit_fail(); + } + + mq_unlink(name); + return mqd; +} + +static void send_msg(mqd_t mqd, unsigned int prio, const char *text, size_= t len) +{ + if (mq_send(mqd, text, len, prio) !=3D 0) { + ksft_test_result_fail("mq_send(prio=3D%u): %m\n", prio); + ksft_exit_fail(); + } +} + +static long peek(mqd_t mqd, unsigned long index, char *buf, size_t bufsz, + unsigned int *prio) +{ + struct mq_timedreceive2_args args =3D { + .msg_len =3D bufsz, + .msg_prio =3D prio, + .msg_ptr =3D buf, + }; + return mq_timedreceive2(mqd, &args, MQ_PEEK, index, NULL); +} + +static long queue_depth(mqd_t mqd) +{ + struct mq_attr attr; + + if (mq_getattr(mqd, &attr) !=3D 0) + return -1; + return attr.mq_curmsgs; +} + +static void test_peek_empty_queue(void) +{ + mqd_t mqd =3D open_queue("empty", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + + ret =3D peek(mqd, 0, buf, sizeof(buf), &prio); + if (ret =3D=3D -1 && errno =3D=3D EAGAIN) + ksft_test_result_pass("peek on empty queue [EAGAIN]\n"); + else + ksft_test_result_fail("peek on empty queue: expected EAGAIN, got ret=3D%= ld errno=3D%d (%m)\n", + ret, errno); + + mq_close(mqd); +} + +static void test_peek_invalid_fd(void) +{ + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + + ret =3D peek((mqd_t)-1, 0, buf, sizeof(buf), &prio); + if (ret =3D=3D -1 && errno =3D=3D EBADF) + ksft_test_result_pass("peek invalid fd [ EBADF]\n"); + else + ksft_test_result_fail("peek invalid fd: expected EBADF, got ret=3D%ld er= rno=3D%d\n", + ret, errno); +} + +static void test_peek_non_mqueue_fd(void) +{ + int pipefd[2]; + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + + if (pipe(pipefd) !=3D 0) { + ksft_test_result_skip("pipe() failed, skipping non-mqueue-fd test\n"); + return; + } + + ret =3D peek((mqd_t)pipefd[0], 0, buf, sizeof(buf), &prio); + if (ret =3D=3D -1 && errno =3D=3D EBADF) + ksft_test_result_pass("peek on pipe fd [EBADF]\n"); + else + ksft_test_result_fail("peek non-mqueue fd: expected EBADF, got ret=3D%ld= errno=3D%d\n", + ret, errno); + + close(pipefd[0]); + close(pipefd[1]); +} + +static void test_peek_writeonly_fd(void) +{ + char name[] =3D "/ksft_mq_peek_wo"; + struct mq_attr attr =3D { .mq_maxmsg =3D 4, .mq_msgsize =3D MAX_MSG_SIZE = }; + mqd_t rw, wo; + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + + mq_unlink(name); + rw =3D mq_open(name, O_RDWR | O_CREAT, 0600, &attr); + if (rw =3D=3D (mqd_t)-1) { + ksft_test_result_skip("mq_open RW failed: %m\n"); + return; + } + wo =3D mq_open(name, O_WRONLY); + mq_unlink(name); + + if (wo =3D=3D (mqd_t)-1) { + ksft_test_result_skip("mq_open WO failed: %m\n"); + mq_close(rw); + return; + } + + send_msg(rw, PRIO_HIGH, "x", 1); + + ret =3D peek(wo, 0, buf, sizeof(buf), &prio); + if (ret =3D=3D -1 && errno =3D=3D EBADF) + ksft_test_result_pass("peek on O_WRONLY fd [EBADF]\n"); + else + ksft_test_result_fail("peek WO fd: expected EBADF, got ret=3D%ld errno= =3D%d\n", + ret, errno); + + mq_close(wo); + mq_close(rw); +} + +static void test_peek_buffer_too_small(void) +{ + mqd_t mqd =3D open_queue("small", MAX_MSG_SIZE); + char tiny[1]; /* deliberately too small */ + unsigned int prio; + struct mq_timedreceive2_args args =3D { + .msg_len =3D sizeof(tiny), + .msg_prio =3D &prio, + .msg_ptr =3D tiny, + }; + long ret; + + send_msg(mqd, PRIO_HIGH, "hello", 5); + + ret =3D mq_timedreceive2(mqd, &args, MQ_PEEK, 0, NULL); + if (ret =3D=3D -1 && errno =3D=3D EMSGSIZE) + ksft_test_result_pass("peek with small buf [EMSGSIZE]\n"); + else + ksft_test_result_fail("peek small buf: expected EMSGSIZE, got ret=3D%ld = errno=3D%d\n", + ret, errno); + + mq_close(mqd); +} + +static void test_peek_bad_msg_ptr(void) +{ + mqd_t mqd =3D open_queue("bad_ptr", MAX_MSG_SIZE); + unsigned int prio; + + struct mq_timedreceive2_args args =3D { + .msg_len =3D MAX_MSG_SIZE, + .msg_prio =3D &prio, + .msg_ptr =3D (char *)0x1, + }; + + long ret; + + send_msg(mqd, PRIO_HIGH, "payload", 7); + ret =3D mq_timedreceive2(mqd, &args, MQ_PEEK, 0, NULL); + if (ret =3D=3D -1 && errno =3D=3D EFAULT) + ksft_test_result_pass("peek bad msg_ptr [EFAULT]\n"); + else + ksft_test_result_fail("peek bad msg_ptr: expected EFAULT, got ret=3D%ld = errno=3D%d\n", + ret, errno); + + mq_close(mqd); +} + +static void test_peek_index_out_of_range(void) +{ + mqd_t mqd =3D open_queue("oob", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + + send_msg(mqd, PRIO_MED, "one", 3); + ret =3D peek(mqd, 1, buf, sizeof(buf), &prio); + if (ret =3D=3D -1 && errno =3D=3D ENOENT) + ksft_test_result_pass("peek OOB index [ENOENT]\n"); + else + ksft_test_result_fail("peek OOB: expected ENOENT, got ret=3D%ld errno=3D= %d\n", + ret, errno); + + mq_close(mqd); +} + +static void test_peek_basic_data(void) +{ + mqd_t mqd =3D open_queue("basic", MAX_MSG_SIZE); + const char *payload =3D "peek-test-payload"; + char buf[MAX_MSG_SIZE]; + unsigned int prio =3D 0; + long ret; + + send_msg(mqd, PRIO_HIGH, payload, strlen(payload)); + + memset(buf, 0, sizeof(buf)); + ret =3D peek(mqd, 0, buf, sizeof(buf), &prio); + + if (ret < 0) { + ksft_test_result_fail("basic peek failed: ret=3D%ld errno=3D%d (%m)\n", = ret, errno); + goto out; + } + if ((size_t)ret !=3D strlen(payload)) { + ksft_test_result_fail("basic peek: wrong size %ld (expected %zu)\n", ret= , strlen(payload)); + goto out; + } + if (memcmp(buf, payload, strlen(payload)) !=3D 0) { + ksft_test_result_fail("basic peek: payload mismatch\n"); + goto out; + } + if (prio !=3D PRIO_HIGH) { + ksft_test_result_fail("basic peek: wrong prio %u (expected %d)\n", prio,= PRIO_HIGH); + goto out; + } + ksft_test_result_pass("basic peek: correct data and priority\n"); +out: + mq_close(mqd); +} + +static void test_peek_nondestructive(void) +{ + mqd_t mqd =3D open_queue("nodestr", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + unsigned int prio; + int i; + + send_msg(mqd, PRIO_HIGH, "A", 1); + send_msg(mqd, PRIO_MED, "B", 1); + send_msg(mqd, PRIO_LOW, "C", 1); + + if (queue_depth(mqd) !=3D 3) { + ksft_test_result_fail("initial depth !=3D 3\n"); + mq_close(mqd); + return; + } + + for (i =3D 0; i < 10; i++) { + peek(mqd, 0, buf, sizeof(buf), &prio); + peek(mqd, 1, buf, sizeof(buf), &prio); + peek(mqd, 2, buf, sizeof(buf), &prio); + } + + if (queue_depth(mqd) =3D=3D 3) + ksft_test_result_pass("peek is non-destructive (depth stays 3)\n"); + else + ksft_test_result_fail("peek modified queue: depth=3D%ld (expected 3)\n",= queue_depth(mqd)); + + mq_close(mqd); +} + +static void test_peek_priority_order(void) +{ + mqd_t mqd =3D open_queue("prio_order", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + int pass =3D 1; + + send_msg(mqd, PRIO_LOW, "low", 3); + send_msg(mqd, PRIO_HIGH, "high", 4); + send_msg(mqd, PRIO_MED, "med", 3); + + /* index 0 must return highest priority */ + ret =3D peek(mqd, 0, buf, sizeof(buf), &prio); + if (ret < 0 || prio !=3D PRIO_HIGH) { + ksft_test_result_fail("prio_order index0: prio=3D%u ret=3D%ld errno=3D%d= \n", prio, + ret, errno); + pass =3D 0; + } + if (pass && memcmp(buf, "high", 4) !=3D 0) { + ksft_test_result_fail("prio_order index0: wrong payload\n"); + pass =3D 0; + } + + /* index 1 must return medium priority */ + ret =3D peek(mqd, 1, buf, sizeof(buf), &prio); + if (pass && (ret < 0 || prio !=3D PRIO_MED)) { + ksft_test_result_fail("prio_order index1: prio=3D%u ret=3D%ld\n", + prio, ret); + pass =3D 0; + } + if (pass && memcmp(buf, "med", 3) !=3D 0) { + ksft_test_result_fail("prio_order index1: wrong payload\n"); + pass =3D 0; + } + + /* index 2 must return lowest priority */ + ret =3D peek(mqd, 2, buf, sizeof(buf), &prio); + if (pass && (ret < 0 || prio !=3D PRIO_LOW)) { + ksft_test_result_fail("prio_order index2: prio=3D%u ret=3D%ld\n", + prio, ret); + pass =3D 0; + } + if (pass && memcmp(buf, "low", 3) !=3D 0) { + ksft_test_result_fail("prio_order index2: wrong payload\n"); + pass =3D 0; + } + + if (pass) + ksft_test_result_pass("priority ordering: index0=3DHIGH, index1=3DMED, i= ndex2=3DLOW\n"); + + mq_close(mqd); +} + +static void test_peek_fifo_within_priority(void) +{ + mqd_t mqd =3D open_queue("fifo", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + int pass =3D 1; + + send_msg(mqd, PRIO_HIGH, "first", 5); + send_msg(mqd, PRIO_HIGH, "second", 6); + send_msg(mqd, PRIO_HIGH, "third", 5); + + memset(buf, 0, sizeof(buf)); + ret =3D peek(mqd, 0, buf, sizeof(buf), &prio); + if (ret < 0 || memcmp(buf, "first", 5) !=3D 0) { + ksft_test_result_fail("FIFO peek[0]: expected 'first', got '%.*s' ret=3D= %ld\n", + (int)ret, buf, ret); + pass =3D 0; + } + + if (pass) { + char rbuf[MAX_MSG_SIZE]; + unsigned int rprio; + + ssize_t r =3D mq_receive(mqd, rbuf, sizeof(rbuf), &rprio); + + if (r < 0 || memcmp(rbuf, "first", 5) !=3D 0) { + ksft_test_result_fail("mq_receive 'first' failed\n"); + pass =3D 0; + } + } + + if (pass) { + char rbuf[MAX_MSG_SIZE]; + unsigned int rprio; + + memset(buf, 0, sizeof(buf)); + + ret =3D peek(mqd, 0, buf, sizeof(buf), &prio); + if (ret < 0 || memcmp(buf, "second", 6) !=3D 0) { + ksft_test_result_fail("FIFO peek after receive: expected 'second', got = '%.*s'\n", + (int)ret, buf); + pass =3D 0; + } + } + + if (pass) + ksft_test_result_pass("FIFO within same priority is correct\n"); + + mq_close(mqd); +} + +static void test_peek_all_indices(void) +{ + const unsigned int prios[] =3D { 2, 7, 4, 9, 1, 6 }; + const int N =3D ARRAY_SIZE(prios); + mqd_t mqd =3D open_queue("all_idx", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + char expected_payload[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + int i, pass =3D 1; + unsigned int sorted[6]; + + for (i =3D 0; i < N; i++) { + snprintf(expected_payload, sizeof(expected_payload), + "msg_prio_%u", prios[i]); + send_msg(mqd, prios[i], expected_payload, + strlen(expected_payload)); + sorted[i] =3D prios[i]; + } + + for (i =3D 0; i < N - 1; i++) { + int j; + + for (j =3D i + 1; j < N; j++) { + if (sorted[j] > sorted[i]) { + + unsigned int tmp =3D sorted[i]; + sorted[i] =3D sorted[j]; + sorted[j] =3D tmp; + } + } + } + + for (i =3D 0; i < N && pass; i++) { + memset(buf, 0, sizeof(buf)); + + ret =3D peek(mqd, (unsigned long)i, buf, sizeof(buf), &prio); + + if (ret < 0) { + ksft_test_result_fail("all_indices peek[%d] failed: ret=3D%ld errno=3D%= d\n", + i, ret, errno); + pass =3D 0; + break; + } + if (prio !=3D sorted[i]) { + ksft_test_result_fail("all_indices peek[%d]: prio=3D%u expected=3D%u\n", + i, prio, sorted[i]); + pass =3D 0; + } + + snprintf(expected_payload, sizeof(expected_payload), + "msg_prio_%u", sorted[i]); + if (memcmp(buf, expected_payload, strlen(expected_payload))) { + ksft_test_result_fail("all_indices peek[%d]: payload mismatch\n", i); + pass =3D 0; + } + } + + if (pass && queue_depth(mqd) !=3D N) { + ksft_test_result_fail("all_indices: depth=3D%ld expected=3D%d after peek= \n", + queue_depth(mqd), N); + pass =3D 0; + } + + if (pass) { + ret =3D peek(mqd, (unsigned long)N, buf, sizeof(buf), &prio); + if (!(ret =3D=3D -1 && errno =3D=3D ENOENT)) { + ksft_test_result_fail("all_indices OOB[%d]: expected ENOENT, got ret=3D= %ld errno=3D%d\n", + N, ret, errno); + pass =3D 0; + } + } + + if (pass) + ksft_test_result_pass("all-indices: correct prio order + OOB ENOENT\n"); + + mq_close(mqd); +} + +static void test_peek_large_message(void) +{ + mqd_t mqd =3D open_queue("large", LARGE_MSG_SIZE); + char *send_buf, *recv_buf; + unsigned int prio =3D 0; + long ret; + int pass =3D 1; + + send_buf =3D malloc(LARGE_MSG_SIZE); + recv_buf =3D calloc(1, LARGE_MSG_SIZE); + if (!send_buf || !recv_buf) { + ksft_test_result_skip("OOM allocating large message buffers\n"); + goto out; + } + + for (int i =3D 0; i < LARGE_MSG_SIZE; i++) + send_buf[i] =3D (char)(i & 0xFF); + + send_msg(mqd, PRIO_HIGH, send_buf, LARGE_MSG_SIZE); + + ret =3D peek(mqd, 0, recv_buf, LARGE_MSG_SIZE, &prio); + if (ret !=3D LARGE_MSG_SIZE) { + ksft_test_result_fail("large msg peek: ret=3D%ld expected=3D%d\n", + ret, LARGE_MSG_SIZE); + pass =3D 0; + } + if (pass && memcmp(send_buf, recv_buf, LARGE_MSG_SIZE) !=3D 0) { + ksft_test_result_fail("large msg peek: payload mismatch\n"); + pass =3D 0; + } + if (pass && prio !=3D PRIO_HIGH) { + ksft_test_result_fail("large msg peek: prio=3D%u expected=3D%d\n", prio,= PRIO_HIGH); + pass =3D 0; + } + if (pass && queue_depth(mqd) !=3D 1) { + ksft_test_result_fail("large msg peek: queue modified (depth=3D%ld)\n", = queue_depth(mqd)); + pass =3D 0; + } + if (pass) + ksft_test_result_pass("large (%d B) multi-segment peek: correct\n", LARG= E_MSG_SIZE); +out: + free(send_buf); + free(recv_buf); + mq_close(mqd); +} + +static void test_no_peek_flag_is_receive(void) +{ + mqd_t mqd =3D open_queue("nopeek", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + unsigned int prio =3D 0; + struct mq_timedreceive2_args args =3D { + .msg_len =3D sizeof(buf), + .msg_prio =3D &prio, + .msg_ptr =3D buf, + }; + long ret; + + send_msg(mqd, PRIO_HIGH, "consume-me", 10); + + ret =3D mq_timedreceive2(mqd, &args, 0, 0, NULL); + if (ret < 0) { + ksft_test_result_fail("no-peek receive failed: ret=3D%ld errno=3D%d\n", = ret, errno); + mq_close(mqd); + return; + } + if (queue_depth(mqd) !=3D 0) + ksft_test_result_fail("no-peek: queue still has messages (depth=3D%ld)\n= ", queue_depth(mqd)); + else + ksft_test_result_pass("without MQ_PEEK the message is consumed normally\= n"); + + mq_close(mqd); +} + +struct race_ctx { + mqd_t mqd; + int errors; +}; + +static void *receiver_thread(void *arg) +{ + struct race_ctx *ctx =3D arg; + char buf[MAX_MSG_SIZE]; + unsigned int prio; + ssize_t r; + + while ((r =3D mq_receive(ctx->mqd, buf, sizeof(buf), &prio)) > 0) + ; + + return NULL; +} + +static void test_peek_concurrent_receive(void) +{ + struct race_ctx ctx; + pthread_t tid; + char buf[MAX_MSG_SIZE]; + unsigned int prio; + long ret; + int i; + + ctx.mqd =3D open_queue("concurrent", MAX_MSG_SIZE); + ctx.errors =3D 0; + + for (i =3D 0; i < MQ_MAXMSG; i++) { + char payload[32]; + + snprintf(payload, sizeof(payload), "msg%d", i); + send_msg(ctx.mqd, (unsigned int)(i % 5) + 1, payload, + strlen(payload)); + } + + if (pthread_create(&tid, NULL, receiver_thread, &ctx) !=3D 0) { + ksft_test_result_skip("pthread_create failed\n"); + mq_close(ctx.mqd); + return; + } + + /* + * Peek repeatedly.The queue is being drained concurrently. + */ + for (i =3D 0; i < 200; i++) { + ret =3D peek(ctx.mqd, (unsigned long)(i % 4), buf, sizeof(buf), + &prio); + if (ret < 0 && errno !=3D EAGAIN && errno !=3D ENOENT) { + ctx.errors++; + } + } + + pthread_join(tid, NULL); + + if (ctx.errors =3D=3D 0) + ksft_test_result_pass("concurrent peek+receive: no unexpected errors\n"); + else + ksft_test_result_fail("concurrent peek+receive: %d unexpected errors\n",= ctx.errors); + + mq_close(ctx.mqd); +} + +static void test_peek_null_prio_ptr(void) +{ + mqd_t mqd =3D open_queue("null_prio", MAX_MSG_SIZE); + char buf[MAX_MSG_SIZE]; + struct mq_timedreceive2_args args =3D { + .msg_len =3D sizeof(buf), + .msg_prio =3D NULL, + .msg_ptr =3D buf, + }; + long ret; + + send_msg(mqd, PRIO_MED, "no-prio-needed", 14); + + ret =3D mq_timedreceive2(mqd, &args, MQ_PEEK, 0, NULL); + if (ret >=3D 0) + ksft_test_result_pass("peek with NULL msg_prio ptr: OK\n"); + else + ksft_test_result_fail("peek NULL msg_prio: ret=3D%ld errno=3D%d (%m)\n",= ret, errno); + + mq_close(mqd); +} + +static void test_peek_priority_matches_receive(void) +{ + mqd_t mqd =3D open_queue("prio_match", MAX_MSG_SIZE); + char peek_buf[MAX_MSG_SIZE], recv_buf[MAX_MSG_SIZE]; + unsigned int peek_prio =3D 0, recv_prio =3D 0; + long peek_ret; + ssize_t recv_ret; + int pass =3D 1; + + send_msg(mqd, PRIO_MED, "consistent-prio", 15); + + peek_ret =3D peek(mqd, 0, peek_buf, sizeof(peek_buf), &peek_prio); + if (peek_ret < 0) { + ksft_test_result_fail("peek failed: %m\n"); + mq_close(mqd); + return; + } + + recv_ret =3D mq_receive(mqd, recv_buf, sizeof(recv_buf), &recv_prio); + if (recv_ret < 0) { + ksft_test_result_fail("mq_receive failed: %m\n"); + mq_close(mqd); + return; + } + + if (peek_prio !=3D recv_prio) { + ksft_test_result_fail("prio mismatch: peek=3D%u receive=3D%u\n", + peek_prio, recv_prio); + pass =3D 0; + } + if (pass && peek_ret !=3D recv_ret) { + ksft_test_result_fail("size mismatch: peek=3D%ld receive=3D%zd\n", + peek_ret, recv_ret); + pass =3D 0; + } + if (pass && memcmp(peek_buf, recv_buf, (size_t)recv_ret) !=3D 0) { + ksft_test_result_fail("payload mismatch between peek and receive\n"); + pass =3D 0; + } + if (pass) + ksft_test_result_pass("peeked priority/payload matches mq_receive output= \n"); + + mq_close(mqd); +} + +static const struct { + const char *name; + void (*fn)(void); +} tests[] =3D { + { "empty queue =E2=86=92 EAGAIN", test_peek_empty_queue }, + { "invalid fd =E2=86=92 EBADF", test_peek_invalid_fd }, + { "non-mqueue fd =E2=86=92 EBADF", test_peek_non_mqueue_fd }, + { "O_WRONLY fd =E2=86=92 EBADF", test_peek_writeonly_fd }, + { "buffer too small =E2=86=92 EMSGSIZE", test_peek_buffer_too_small }, + { "bad msg_ptr =E2=86=92 EFAULT", test_peek_bad_msg_ptr }, + { "OOB index =E2=86=92 ENOENT", test_peek_index_out_of_range }, + { "basic data+prio correctness", test_peek_basic_data }, + { "non-destructive semantics", test_peek_nondestructive }, + { "priority ordering across indices", test_peek_priority_order }, + { "FIFO within same priority", test_peek_fifo_within_priority }, + { "all distinct priority indices", test_peek_all_indices }, + { "large multi-segment message", test_peek_large_message }, + { "no MQ_PEEK =E2=86=92 normal receive", test_no_peek_flag_is_receive }, + { "concurrent peek + receive", test_peek_concurrent_receive }, + { "NULL msg_prio ptr", test_peek_null_prio_ptr }, + { "peeked prio matches mq_receive", + test_peek_priority_matches_receive }, +}; + +int main(void) +{ + unsigned int i; + long sc_ret; + + ksft_print_header(); + ksft_set_plan(ARRAY_SIZE(tests)); + + { + struct mq_timedreceive2_args probe_args =3D { 0 }; + + sc_ret =3D mq_timedreceive2((mqd_t)-1, &probe_args, MQ_PEEK, 0, + NULL); + if (sc_ret =3D=3D -1 && errno =3D=3D ENOSYS) + ksft_exit_skip("mq_timedreceive2 syscall not available (NR=3D%d ENOSYS)= =E2=80=94 is the kernel too old?\n", + __NR_mq_timedreceive2); + } + + for (i =3D 0; i < ARRAY_SIZE(tests); i++) { + ksft_print_msg("--- [%02u] %s ---\n", i + 1, tests[i].name); + tests[i].fn(); + } + + return ksft_get_fail_cnt() ? 1 : 0; +} --=20 2.43.0 From nobody Mon Apr 6 09:10:55 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 86D0F2E6CA6 for ; Fri, 20 Mar 2026 05:24:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984289; cv=none; b=RXbBw114kSSuGGWXShYE6E4FrT9AIrEEmRlW5celbYulW2vEr+MyHIgrO8n26A4Jy7Mbl7zjz7CX9V+892nDUSjRFZ/6jLclPo/gxBJanxtySjoKPJUIKK8qTcN/rEGlrA7sfm7IrUCLeFaf1GwsKR7QxQkRR6KZ0cw67DszIZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773984289; c=relaxed/simple; bh=bBQ8eU9COzhoiSE8iroJ9UrjlJbEQHeRPmWx2f4Tifw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FzbbbXcbwZJ1i6uvV4spegWfffajQNcg889u/nEx5/1+RtYFABpK1F7mod3wvsqIjb/viQsEUxg2IlD5dmJ/D82TGi7BvvT5jlfES1erIXKR/U/FpkuYx5ytLgMjQpVIp4R0wP+XtgvXpXS2ybP+ZS8+7QZZjeTp0Jp1fcrxsTE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ba7H+lPU; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ba7H+lPU" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-354a18c48b5so1182003a91.1 for ; Thu, 19 Mar 2026 22:24:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773984288; x=1774589088; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=o072AjhwxnOu54vKZkT8gFGqCYJjeQUma+HHruoaLvA=; b=Ba7H+lPUqHi2AVem+3+wyqTb2WQBY8xjKRJDCtGtB+gs1DCUWv1mwqvT4+ClBtoF5/ vxygw/Bsku1rm3/Ik0SQVi7ZxvSCyE14Wh5TdjUOgG5w83JH7lDyGCW8n9xPzTxL0rmL OeacVwYSoey7JH3ylXtl+PcMGh+YjPyM8LXvRkbDYExq82IhWE7K4oSDp//0pWH6HiSb 3iCaCUQXsZHWnRAf1vtUlRe+RN68RVF19ylh2RohDwca8ClPFYIp9naOF3DQebA0TV5n 36jo6oXrFshiFWBqSZFseBLkEMQHpoMtsrzsYu91fDG6XqwCkDVU13/h6Ej9gy59XS0z H+Zw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773984288; x=1774589088; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=o072AjhwxnOu54vKZkT8gFGqCYJjeQUma+HHruoaLvA=; b=cXQERqFFFU/mcujnd7YXL9qFU0plIWHtSJIqkAOeVm+tD6Lo8CPQRi8rC67ClfeqtT +Su25Kpb8cVbO7xScrXLgCN597zIQkIXfoy9B6NhDqrUi9i+sS36VGuO/QgGfmPtySxy OBNGfuSy7LkFzMKyIN17pUl1ZuHWN0tmyQcJd6Tl0wHTWuKxafdEppeCRC74zJMM6Fzi mqrzEfDPFX3mIf/I2eHHSo6Wu6nFQcySFHwBZkAOMkNX7OPW5YHvbwsjwKN2lS2AG9OP Cxr39+EsSQbCZLZm+A1wfLG2gFgtIafoqOR+yDpDTwqrRru6YEK5Rb7tVddh2zwiLRaU zeFg== X-Forwarded-Encrypted: i=1; AJvYcCUwLZAMhJpieaacj23YuCt9ctnazN4MlMllD0E4I2wpgR3OOmXloDz1Al1M3U2qBz0luchb8QTvu7xZFaU=@vger.kernel.org X-Gm-Message-State: AOJu0Yyu9gENrZfVxdU2gxhKR6D3doz9fwyxT1otX4p4FAvqhhy4xapo 9/JCt5/k3mR5sg0vCehfIkrrujKLOB8/t70j50x+W++hHroHT64ePkvj X-Gm-Gg: ATEYQzz81CatMmQbUS/bvkPws+wfsXf+fn/a0yIk6xU2EhnqR33EQL8n63iX3WYv5P6 iVa7dM+KF6mIHAe+RLB6UTVTNxzD7iupjZ71eZq/RsfMTVI8vjL2D2rE5/RTJI5bPAW9zQIh8sx fygRkxAEgmM+4WGWC4cYrea7eTlw2nXC/m/JoMnK8mL3iyvJR/JayxVvlYjNlseexRTJ+TpScFt ePs6M0wqTEQXyX5wlfsymtnQXH0W+zaYZql1ogL7TtVvEwthI80rLt07gFF3QPTMFkxmEebls0w IzFtqD5DDDJV2ifcNdtWQTu8IFdKWSWaKfFL8yGLjR9cbUkT6kYYhOuQmO9xZHbweMNt+lAisaH dXQG07I2/8s1v3pEJDOID2+Y0xn5+8GgPzm1//GClJD8P0K1HSdKt+bg8eA7e0AQGbW/k6EDwKG GyYxejYX+tF2W0tUEtex1VdwH/PzBcAjQKdCg= X-Received: by 2002:a17:90b:4d:b0:35b:a170:f266 with SMTP id 98e67ed59e1d1-35bd2c2090dmr1454113a91.13.1773984288006; Thu, 19 Mar 2026 22:24:48 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b471:fd0e:76f1:2fa0:b416:4f73]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd40e4bfdsm779344a91.9.2026.03.19.22.24.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Mar 2026 22:24:47 -0700 (PDT) From: Mathura_Kumar To: brauner@kernel.org Cc: academic1mathura@gmail.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, viro@zeniv.linux.org.uk Subject: [PATCH RESEND v2 4/4]IPC:Added entry in performance tools for new system call Date: Fri, 20 Mar 2026 10:53:38 +0530 Message-ID: <20260320052340.6696-5-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260320052340.6696-1-academic1mathura@gmail.com> References: <20260320052340.6696-1-academic1mathura@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Signed-off-by: Mathura_Kumar --- tools/perf/arch/alpha/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/arm/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/arm64/entry/syscalls/syscall_32.tbl | 1 + tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl | 1 + tools/perf/arch/parisc/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/powerpc/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/s390/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/sh/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/sparc/entry/syscalls/syscall.tbl | 1 + tools/perf/arch/x86/entry/syscalls/syscall_32.tbl | 1 + tools/perf/arch/x86/entry/syscalls/syscall_64.tbl | 1 + tools/perf/arch/xtensa/entry/syscalls/syscall.tbl | 1 + tools/scripts/syscall.tbl | 1 + 13 files changed, 13 insertions(+) diff --git a/tools/perf/arch/alpha/entry/syscalls/syscall.tbl b/tools/perf/= arch/alpha/entry/syscalls/syscall.tbl index 74720667fe09..95893d9ec401 100644 --- a/tools/perf/arch/alpha/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/alpha/entry/syscalls/syscall.tbl @@ -502,3 +502,4 @@ 570 common lsm_set_self_attr sys_lsm_set_self_attr 571 common lsm_list_modules sys_lsm_list_modules 572 common mseal sys_mseal +582 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/tools/perf/arch/arm/entry/syscalls/syscall.tbl b/tools/perf/ar= ch/arm/entry/syscalls/syscall.tbl index fd09afae72a2..40b018f08f7d 100644 --- a/tools/perf/arch/arm/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/arm/entry/syscalls/syscall.tbl @@ -485,3 +485,4 @@ 468 common file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr 470 common listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/tools/perf/arch/arm64/entry/syscalls/syscall_32.tbl b/tools/pe= rf/arch/arm64/entry/syscalls/syscall_32.tbl index 9a37930d4e26..0e9ff6deb3fa 100644 --- a/tools/perf/arch/arm64/entry/syscalls/syscall_32.tbl +++ b/tools/perf/arch/arm64/entry/syscalls/syscall_32.tbl @@ -474,3 +474,4 @@ 460 common lsm_set_self_attr sys_lsm_set_self_attr 461 common lsm_list_modules sys_lsm_list_modules 462 common mseal sys_mseal +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 \ No newline at end of file diff --git a/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl b/tools/pe= rf/arch/mips/entry/syscalls/syscall_n64.tbl index 9b92bddf06b5..154886e07e8b 100644 --- a/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl +++ b/tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl @@ -385,3 +385,4 @@ 468 n64 file_getattr sys_file_getattr 469 n64 file_setattr sys_file_setattr 470 n64 listns sys_listns +472 n64 mq_timedreceive2 sys_mq_timedreceive2 diff --git a/tools/perf/arch/parisc/entry/syscalls/syscall.tbl b/tools/perf= /arch/parisc/entry/syscalls/syscall.tbl index 66dc406b12e4..f1741102631b 100644 --- a/tools/perf/arch/parisc/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/parisc/entry/syscalls/syscall.tbl @@ -461,3 +461,4 @@ 460 common lsm_set_self_attr sys_lsm_set_self_attr 461 common lsm_list_modules sys_lsm_list_modules 462 common mseal sys_mseal +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/per= f/arch/powerpc/entry/syscalls/syscall.tbl index ec4458cdb97b..9326132328bf 100644 --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl @@ -561,3 +561,4 @@ 468 common file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr 470 common listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 diff --git a/tools/perf/arch/s390/entry/syscalls/syscall.tbl b/tools/perf/a= rch/s390/entry/syscalls/syscall.tbl index 5863787ab036..003603fd789b 100644 --- a/tools/perf/arch/s390/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/s390/entry/syscalls/syscall.tbl @@ -473,3 +473,4 @@ 468 common file_getattr sys_file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr sys_file_setattr 470 common listns sys_listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrec= eive2 diff --git a/tools/perf/arch/sh/entry/syscalls/syscall.tbl b/tools/perf/arc= h/sh/entry/syscalls/syscall.tbl index 969c11325ade..af944271a813 100644 --- a/tools/perf/arch/sh/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/sh/entry/syscalls/syscall.tbl @@ -474,3 +474,4 @@ 468 common file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr 470 common listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/tools/perf/arch/sparc/entry/syscalls/syscall.tbl b/tools/perf/= arch/sparc/entry/syscalls/syscall.tbl index 39aa26b6a50b..7236b2158ae0 100644 --- a/tools/perf/arch/sparc/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/sparc/entry/syscalls/syscall.tbl @@ -516,3 +516,4 @@ 468 common file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr 470 common listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 diff --git a/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl b/tools/perf= /arch/x86/entry/syscalls/syscall_32.tbl index e979a3eac7a3..a93f76e01232 100644 --- a/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl +++ b/tools/perf/arch/x86/entry/syscalls/syscall_32.tbl @@ -476,3 +476,4 @@ 468 i386 file_getattr sys_file_getattr 469 i386 file_setattr sys_file_setattr 470 i386 listns sys_listns +472 i386 mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedreceiv= e2 diff --git a/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl b/tools/perf= /arch/x86/entry/syscalls/syscall_64.tbl index 8a4ac4841be6..b6521fc1045b 100644 --- a/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl +++ b/tools/perf/arch/x86/entry/syscalls/syscall_64.tbl @@ -440,3 +440,4 @@ 547 x32 pwritev2 compat_sys_pwritev64v2 # This is the end of the legacy x32 range. Numbers 548 and above are # not special and are not to be used for x32-specific syscalls. +548 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedrece= ive2 diff --git a/tools/perf/arch/xtensa/entry/syscalls/syscall.tbl b/tools/perf= /arch/xtensa/entry/syscalls/syscall.tbl index 438a3b170402..9525878dd8b1 100644 --- a/tools/perf/arch/xtensa/entry/syscalls/syscall.tbl +++ b/tools/perf/arch/xtensa/entry/syscalls/syscall.tbl @@ -441,3 +441,4 @@ 468 common file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr 470 common listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 diff --git a/tools/scripts/syscall.tbl b/tools/scripts/syscall.tbl index e74868be513c..576d34045747 100644 --- a/tools/scripts/syscall.tbl +++ b/tools/scripts/syscall.tbl @@ -411,3 +411,4 @@ 468 common file_getattr sys_file_getattr 469 common file_setattr sys_file_setattr 470 common listns sys_listns +472 common mq_timedreceive2 sys_mq_timedreceive2 compat_sys_mq_timedreceiv= e2 --=20 2.43.0