From nobody Tue Apr 7 07:33:18 2026 Received: from mail-pf1-f173.google.com (mail-pf1-f173.google.com [209.85.210.173]) (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 B4785225775 for ; Sun, 15 Mar 2026 04:09:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547774; cv=none; b=R8LzoLkUH/5jHvkf3HxGo2QGG/e8hskVfcHigTRd+ZLlk4QjzXI7AHNkCNhwyNYG2LrOspmbSep3RaninQhxFyxV1T9HyOOJCcQ85NXQehF8oUQDu3zckyCCavSNr1s3CKzjVRfqtoQ3h+7F+DTFTjMiNoSytNnxGXY+WxtRivw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547774; c=relaxed/simple; bh=9AoXedWhdTJbvJI8xTQGUQqd0kav40UzqQRtdNSBzPM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=G5cnUFJ0lU2GRCtC+BuviPovQIvTjjoSrHjyoMH8NoQaJm9R39YjDRGMUvNcQK+IMF9gp2+MDhfae9fDZQK9Ym8u2zg2VPT7HoX37wx3njo8AkNCNoX+ldZOrGq4+8Ax7B8uwyIrH6NM8V9JxLKn9zQWY3C2ivZCI+z5mbIQy94= 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=Lfb9QAOK; arc=none smtp.client-ip=209.85.210.173 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="Lfb9QAOK" Received: by mail-pf1-f173.google.com with SMTP id d2e1a72fcca58-829a9d08644so2005392b3a.1 for ; Sat, 14 Mar 2026 21:09:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773547772; x=1774152572; 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=rf0VF2vHYjYtYJbxl16wx5Z2RzFLyHEifM4cJwLvvBM=; b=Lfb9QAOK+g1/IyB04ikpFA2bc7U50WNpXqetXWIPlckC+VMYdL+LzyeyHxxmxQAXzT GUr8EG9mKVj4TU/TsNsKyrxVhvXKmMkKrlshldGPCBba6k9vkXFIclOLietyNdvRJeLI 6j3b9gtxu0LawnQ9fnOyEpSPa4e14B5Nn94kkdhDq2bq0BX4QXMcWGKh/2P7Nn1G+GEk dNgmo8dCBuEl50F36Q8Pc9RiNFEMDhFMLQfYZef9PixJiAjR5cfGIAQfGTirRTZ7RoK1 chxfgrguH0ColVLOJB4QYOvRaa5guXshkoxXF6hLCdbGfrdWgnNWd9diTklacPJcHVH6 Q7Tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773547772; x=1774152572; 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=rf0VF2vHYjYtYJbxl16wx5Z2RzFLyHEifM4cJwLvvBM=; b=def5Tzk9BrvV48L1Fu1UVYynFw9xtL9GCiZW7NAdHSfT34TQ2Z7lhH2FOXR/yzdVr2 kawp+hlw6MksTXKGVmt0XExk2tH7vMxT9B+Mjf4w2foz+KdBDZhiJZ+7eZjEFiOtseOW qsHlWrJZVtxB85bYYm3hcjZ5LEfFtfP/QNHdCOWNxTXibc7vWqANXoicCy3L1EpJ7l5I 5rv1MH2JfbzUW0dwfYzgt3kTtrFfP3PtKvDO4tGxT+V7QvFSx6dh4v2mMpcLviEBwoB8 I1n+geVAEViWootiPoIWJZcllM+h8pmsCgBpWU2+Et50LpYl4sMNI5HhfHDdGtNAWPVG Rfzg== X-Forwarded-Encrypted: i=1; AJvYcCV+B+nRx1Fq6I/2HOkcVHC2TKAUFdRmjv+g8yCyQwq46Hv29rmS+fNomFbl9WGAEpDqe6odJ/EaZByhS5w=@vger.kernel.org X-Gm-Message-State: AOJu0YwT7sX7ODIQ1NOLgopLeTMCYtvaNIhaUREhP3jEczyPyj61GNB7 u01DmgaX+TNPilLJdA9bSrF1TK8oljvf2Jlc1MTZCNxd3QK8gqA79qJ8 X-Gm-Gg: ATEYQzyRatnc9FncnWQMPXpycQD7kycMdbnC1HqPSsuZJgm5fdta27qvvT+k7GPVSEd PQjk4QFWuLzlUQ7/hoxccQOjJ3aqAyBwtJFNVOQTXDckH3+/J5CIpYFjHJFba/fPn91/tgPm7mE aXCdQqoQr7kRrGskoGTtDlSPKN0qsHOAhJQ7If3zQnH878+i7hy/mM73p0qtg9z+iBIvgAh7S9i nl33SOMev5+Pj/Ib3o2IpmQg+Y0BXFdATaQTrMjxMXznFZ5e7G2ywtMi9ZGRmnisVUvvUYftTPt qNKUwT3iF7ZM5ugeOpUGSwMK8PJrEZcEoj3rZRe8Eb8Utb63NTSRaulXyEH7kAsZGoKOataby0u sbPEZwPjEAgWtewrFQyFpAdQnovvqRdK+6jxceRhe9WWGt34bVEhYKIMXRtS1yjVC4qowJpXYLo xoLP9AM0grNwD68q5IqOdr0D8EM9lSnanOIA== X-Received: by 2002:a05:6a00:7703:b0:824:3cf6:3fb4 with SMTP id d2e1a72fcca58-82a1988f4eamr6145332b3a.32.1773547772057; Sat, 14 Mar 2026 21:09:32 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b50e:ee5b:78d:f26b:704b:c464]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a072449fesm10192206b3a.13.2026.03.14.21.09.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Mar 2026 21:09: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 v1 1/4] IPC: Added New system call do_mq_timedreceive2() for non-destructive peek on posix mqueue Date: Sun, 15 Mar 2026 09:37:57 +0530 Message-ID: <20260315040827.156558-2-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315040827.156558-1-academic1mathura@gmail.com> References: <20260315040827.156558-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 | 18 ++- ipc/mqueue.c | 186 ++++++++++++++++++++++++++++-- ipc/msg.c | 2 +- ipc/msgutil.c | 48 ++++---- ipc/util.h | 3 +- kernel/sys_ni.c | 1 + 9 files changed, 235 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..9a4f5dfa7a68 100644 --- a/include/uapi/linux/mqueue.h +++ b/include/uapi/linux/mqueue.h @@ -18,7 +18,6 @@ =20 #ifndef _LINUX_MQUEUE_H #define _LINUX_MQUEUE_H - #include =20 #define MQ_PRIO_MAX 32768 @@ -33,6 +32,23 @@ 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; +}; + +#ifdef CONFIG_COMPAT +#include + +struct compat_mq_timedreceive2_args { + compat_size_t msg_len; + compat_uptr_t msg_prio; + compat_uptr_t msg_ptr; +}; + +#endif + /* * 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 Tue Apr 7 07:33:18 2026 Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) (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 BF76A225775 for ; Sun, 15 Mar 2026 04:09:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547781; cv=none; b=LVk/RTxk7tCNOoMJ5Vd2UdWsoU7Ns0w3jx/Lm0//+4GPau85bs2oz3J9rvXRndYWc48Nh/RZSxl2qeQuSlVPojEvRrKTpgGDSisUnSs5tO2G7BamNyUH74iiQuy0xlUx46ozw8lvzgSZkfxal5X3tPlKD9lt+EoFfZfNg3f7gG0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547781; c=relaxed/simple; bh=goBBsTk2MYrix5HgSc5P3EgwATIoXdXN56gmrYzwOzE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=srC07VpYmmw6Xw1KtNjHGWR16HGE3bMVFQmYS4/zrU/0McYGOCPZqH1fGrqIUUg0sQXGCs464SfehC8Vm6Kie9Pz6QTKytndC6gOhDAoiuQvNLqE42zTDQfmarcku4cA8eUoyHYZ9prsx35P+zEOdUccv2rO/fnwm8vdC9GI7JQ= 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=OEJQbLBB; arc=none smtp.client-ip=209.85.210.181 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="OEJQbLBB" Received: by mail-pf1-f181.google.com with SMTP id d2e1a72fcca58-827270d50d4so3311960b3a.3 for ; Sat, 14 Mar 2026 21:09:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773547779; x=1774152579; 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=OEJQbLBBQufw2N7d/fqj3mH73y0py15tlV0VFLVN3CO5u6/V3fgXbxRhZER9BDZsZ2 u78Ggfq+rBzjIndUT2FvKPkTn/cXhpI5p9hnvCB/doMVIC87p4123PXYSa5X+Qqg7YDn rbb5PGJdvCQlfV9aNCE2kkfVr9img3RhOn1DplFCveJ5R1hf4TDA4mKzt2dHFW2zZIT4 a/1iDQTLSJ2u8hPwaz6L40AMUxKSSXVnU6kMp6pPl+3IgYfQl2aBdxxpR/zIJ/WR2JlP D4JDbOki0W/vOYdbP46KEo+d1r0TmL9aHTCmAxoucaWVVKVrZF01/8nz8Tbc1QBH6Q54 KoKw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773547779; x=1774152579; 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=K3+LHMnasOyP7t2Wn8cgoMjM1bFI91hklTCApuKKGla29w1pA6uK2SKmwzdakxrbRk KIL+AAZLpC8qxBJCexm04iqA72/cOWaoDOYyDR9vn3hafsF/vfebVrrRtjwXiCeg1pD9 Qtw1AgftFldk7f473lnjF8bhFh87htnvdxIfxq60rYVJCGkHK3Uyx6KJQRES78QryXke ErVo59tDPAzoRb8XsHQwI0Pon0jPpS3vOZP9LAxQuVCLYvGSd0k48qlQ8CqMrO5P5M0y qO0NeTeuqOIAtBN/dsnbFCZvHZeKb6CoulAMJsL5WPZwfGfqWaasT3sMni/Twt75kePq JACw== X-Forwarded-Encrypted: i=1; AJvYcCVW1ecwKnKNlHCqyhQyOikhJoAkOZRwOIa72gYae5ojrZUx6TSg5WjieJWPcPS30lZoz4s1WgG85DY2sHs=@vger.kernel.org X-Gm-Message-State: AOJu0Yx7Wy7c+gul7D09+FjUGey0O8HHekonfDAkdw7/zq4REpm2eWdC LutLlfjTYuwGS0oPzthBsDnK5qDfiNx2MIEbLix2DGdRAKgLyJOMozmmbYJxUw== X-Gm-Gg: ATEYQzySWYjDYZRG38f6pUdm0uER+bKGcFbjQY3hb/oPeDCCeGq7mu/UUVpSMgRe9z4 +wfkXd40f8TlzoN4F9sh2VLoPdOTFOsU2alfQXLvl93cJeQZmff7u5ccs6+CB7TcyINixHN9XAz tARERhiNzWx+bGAZBM3v8r7IGjiuC+jWyidKeZyk+LiQalkWRcP1sJl1ohg60NS5ZqybxleBX/6 XLvpW30wq+3wjL6VUofhFcevVBnF78yW0uWz3p0IMcdBzNAEctLonnLL3g/iAFpOMENjtOLP8Vo sSn5+ispBBvhcKh76SqZHoPoXu/cgk4RW8yuQI9ZatMKWoUC6JUMxpGV4uPbS2ehaGZB7qm+yyA /MJ64aI1hfESPmCmA6m/50plEzcVLxfNsVcH0RzOX34VBDKL+KvqBlHOI9tBi5Y2H7YmpVS5z2E YoTiThcmi3+sZpQK7qA2yYMkJrz1FYrfFqIg== X-Received: by 2002:a05:6a00:3d9b:b0:82a:122e:539c with SMTP id d2e1a72fcca58-82a198456f0mr6696689b3a.20.1773547778975; Sat, 14 Mar 2026 21:09:38 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b50e:ee5b:78d:f26b:704b:c464]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a072449fesm10192206b3a.13.2026.03.14.21.09.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Mar 2026 21:09:38 -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 v1 2/4] IPC: Added system call number in all most common arch. Date: Sun, 15 Mar 2026 09:37:58 +0530 Message-ID: <20260315040827.156558-3-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315040827.156558-1-academic1mathura@gmail.com> References: <20260315040827.156558-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 Tue Apr 7 07:33:18 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (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 3A6D7224B1E for ; Sun, 15 Mar 2026 04:09:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547789; cv=none; b=Zlqz7clIe4ccvVJIj7BB2nytozFhc2I8g4Mx+jsHprxS1BaAOBbrGu3AOCowLQi7PPuMdeibemzBFAl+T3D+wix5bCYUdnycwBRO2HdkDfCAEARTtO8LHy14L87VjvXRwY+yQaabz3ED/NVydgL8cYm2Igd2X67xP/Rl6c6XNhI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547789; c=relaxed/simple; bh=/DeFAgUlo+qfAIACLhOuCQe8PHw7H0K7rpvGU0P4cFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=gU3UctUnFw28XmXyn0CiuXXOZX0z1TkUT9UCfIwAZkPZa0hDYaJeNSLOj24eSPvDTunhixvvabJUzh7y+7Mk53k38sfLYAUEOkQm972UP9f22CwbikmH6owsO2rDiCNiV58m9j2r3h4QRHZGMmx0eqSCQwou+Hngx/2/SGHNRhc= 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=SWT9BrSU; arc=none smtp.client-ip=209.85.210.169 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="SWT9BrSU" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-829b2018c94so1912816b3a.0 for ; Sat, 14 Mar 2026 21:09:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773547787; x=1774152587; 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=SWT9BrSUBM0cC43i06fNVygCjjV6dYr2q2cmByjkZXWkc3TtCDgnhf+iOnw+Z+IdtD dOjbjEejXY+dtGKADC0n9f0p6aqRHbfp64DPEhw+KxmtSZf+IoHd9/NlBVyn+P97tHEE 3+MLZ4J8LFo/wyEL+SZ7sfXYFc87PzSZbZOia0weDS6FH2/2SmSe+LdMrwmhx2oeTdm9 gqY90Y84fYK6ZxFdwC/rME4lVr/hpej6iwmpuG2gwr663SwE5FWupgqCeKBX6OZitV3k xbreKjDuxEWy8CrzVYSp+u2H+Wy3PkEHak40OURENubV4JxDFSIG2SZKn1BVQer2JrgS WFCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773547787; x=1774152587; 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=RKhMcZgcKf4b7HQsF+IGPsq2HJEi8fI8VWQbzE+iomnwao+YiA2A0/WfT6/KtvE44L 8zdvRYDG4/7wKh8mmhddolurzBGVI5xZHixtxRRHaGwbrHHYR8wBY0za67OTVcqzdyz/ r4jNJO8MT9O0VtfK8WwQJquiGplYdCq481awPADMOT7mbf+viD6PtCdH2VElg3tGU7/f FVvZPHZEH43kXc7BEdLT2GWzokumdQo9E7xNyLs1jxOWR7KHzHv0EXqvbP9bLL6unHSe j/hHcpPkPsVSdiUqUuPbQjDSHv9bZBWl3qqnUtGfWcqxMhu3ZZ01H2KEnYL32KZDMntL GZxw== X-Forwarded-Encrypted: i=1; AJvYcCWcEpi1OwrHCczONtBG5AhAJYqa8FhuWhBLsh2YVZBKb9/3ajPEZ/m3JKUOfR7qEG2BTLnRtEBzgkOIB2k=@vger.kernel.org X-Gm-Message-State: AOJu0Yz77taaC3kPXr9YS4LpYZwL1OsEA49jUU1bBdrqCiulZvSTmRgD Zkx6eLFHjsop9o7+jPp8hLCNg6prwH/ws5uQchLOPoGoEKp9CuPlFPct7N1pzg== X-Gm-Gg: ATEYQzz0QjMIYGp6fKc08HWbGvKHokJybXOA/D8gKkGYDXlfiX3pe+7I2P5b531KkKG tmg2h3Xomk4cBdqCRzhfURaTjeOgUOGZxgGC0WAwZ0Z5P0BN3LircUkZCZHOk3mC192X37uy84A 42xZLAPATW0SnaahmIJpeQO/XThjU9C6EHE/IMxf6CfPqX+MC9TxgGoh0b+42+nutYHWPfazhtq qvT9Hc1IYsYjQoV+AouH3+4V1dIa01nIsTQIdmDRSVaDsqdZjXK9WC2dRfof0J6MWj3obyElmNX yUVQw75N3p1J379onsO8PoqsQ54ExyrSBOlR1AndsR9ldosit/pc4GWa1mYz2tR4PSA1uzoV7Nk Sw6lVeUsYVTAMoWQp2FTpxu6Rkz/h0SFNQqUE/ywV2G+C9eK7cJ6Lg2eoei9zxN1nHXWdaPUIp4 ElTKEKr165wHZ79qiWfiLFv1rJaNEM1Z20Mg== X-Received: by 2002:a05:6a00:9295:b0:7aa:a2a8:9808 with SMTP id d2e1a72fcca58-82a196db5c7mr7900629b3a.20.1773547786304; Sat, 14 Mar 2026 21:09:46 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b50e:ee5b:78d:f26b:704b:c464]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a072449fesm10192206b3a.13.2026.03.14.21.09.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Mar 2026 21:09:46 -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 v1 3/4] IPC: Prepared Documentation and test Date: Sun, 15 Mar 2026 09:37:59 +0530 Message-ID: <20260315040827.156558-4-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315040827.156558-1-academic1mathura@gmail.com> References: <20260315040827.156558-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 Tue Apr 7 07:33:18 2026 Received: from mail-pf1-f178.google.com (mail-pf1-f178.google.com [209.85.210.178]) (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 4B60B22D7B9 for ; Sun, 15 Mar 2026 04:09:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547794; cv=none; b=u/3fmpOJ0RoC4VgCWWzmbG4DOlcDrZiYxo2IuqmBTLe8NJ0uW5YU7fEb6kDTZn7hsp1c6/Gejjv5fR9P0D5Mzb9eMa1bl7H93iP5qotmvR4aIe686zNYwtJ1soWabAEQCq7JgoisJXq5yPgPuH4YBTZteKFSj0juHVHIUtgmwjc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773547794; c=relaxed/simple; bh=bBQ8eU9COzhoiSE8iroJ9UrjlJbEQHeRPmWx2f4Tifw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gEHlhCGqYufakvzV99TL8REouk8PXLdihbUSCXf7TLZWyWo1mEZ/z5obgr4uzJgk2+nq66e0EllyEt+vlaqVWnuhvI4WPrJ+XVr2kA6VBKI0szai0ZseEmwUh5igTl794aQBAjWVDtWHQqHCrpzCtm7sQAghyFvW1wYSsVlDRNo= 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=bigBs3RN; arc=none smtp.client-ip=209.85.210.178 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="bigBs3RN" Received: by mail-pf1-f178.google.com with SMTP id d2e1a72fcca58-82989744ee0so3276051b3a.2 for ; Sat, 14 Mar 2026 21:09:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773547792; x=1774152592; 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=bigBs3RNfnc7JJmd330EX6IXr2rs7dkmFfd1ZXeLph52ONddWKUA1n7WZruR0otvro DpnDdW+dRta93vI3wma6jdbIpCB8lM9Lvt1ltSRt8un9Ptma/C5ujpvRaixYJ4TX6cbt QMHtf8+H2klmP8rDtFyiyDzh3WP35yCO9pEvawLQBQKyeJW303opjhb/ax31Cg4Xh0Ti C/rpHHSprvROVhaJGA/ua+HmlE7ygj4P0la2yNawxxJJrGFbjxZk4Y4iTNOAMDYXK2Bi 3VRhojvl0zgoykKDyefuxx8Ak6cmt21L5VKBZ9hCEYD/brMq+U9qD1k+cwobH54d8gvf cY/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773547792; x=1774152592; 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=jhh8EG31KzurjmPtHgW9X2AdL5UOrejQxvwsglQoGiRPav32LNfepV3PDk4W9uHOGS rkfSZCgEso2FPL7+Obemuwqk5eRg/hRw6GFcVu0ZwNPxCVm8ADBbTcZS5pNAo3t0ZoZO xDLqHE1c3Jfnk9EcRdHhXTIivohTDBH3uDvSKYFLthRBs8saWgGYLjFolFD4M4M/walT 3IIppUqoiGWuGt3/yFx4cr2fs+LfAJauhawSihe4sSXyAu1R68rbOeLEcehbRNK/cuNp OKpDLNHs7Y0ip13XhBI59rk5sIqrRJAODcOf9S6jEpK3No5H8VZI6uYc8ub8Rs89wlrf xzNg== X-Forwarded-Encrypted: i=1; AJvYcCVG38g4TE27XxbVt34GsmmtLD7120RQLuoEzYsmCxVRk912huxCEkefsWC5r2ZrDyVjMnWzf39J/06gKaw=@vger.kernel.org X-Gm-Message-State: AOJu0YxDIqNKuErVRVKMMi1LMzQb8FLqgU0tObKqD0qCyVc20zebeCUZ DFc2OkTntFroGy10EslpW+bmywlxht8EJCTXOb33nWnDjuLUREcv+fj4 X-Gm-Gg: ATEYQzzWjlEY/UCP42RxhmMd781n9ojLMufQ2uToc99M8gpwQRbca20LnCp/R/NJ22F Z8nIpL6YZAZWea0lj465CpnDUYTQrar9dzFQJ2N/5UNaHIuDFm8z1KkYD1kYKXS0dyMSaJCj3OM ltMAW3LZvUCnH/D5IBFpesUSn0IyRYgUSQR6c3hellYrBECNB5molorNtTt2L/34HpX83sY5QMF 6Vg0WaeT6EZy7HxEnTwsea/uq3w/GzeJhc0hD1RvmWfXJZNRXUCaY6ORRx2XW+qH63SA3fHa/Hi z3iuUjbHOOy47tCcNAwbPY+WgLu3/C3RkGclKDKx8XsoS4GtgvHjBO70JuWT+a9d7M/2p3vTkR6 /zbMMlA2becnmrV7AdxRrgyiHjwYw9ZRXpY0ksnISf2cUcdksiSLJ6VGQ/6OnmbSNtO5ISDHPSo pqpI6dB8T+RgMlcO3hHK0Z5XXOApAiL8QW3Ir/hddYi3Wq X-Received: by 2002:a05:6a00:37c1:b0:829:7d74:d0d1 with SMTP id d2e1a72fcca58-82a198ef50bmr5674555b3a.36.1773547792480; Sat, 14 Mar 2026 21:09:52 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b50e:ee5b:78d:f26b:704b:c464]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a072449fesm10192206b3a.13.2026.03.14.21.09.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Mar 2026 21:09:52 -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 v1 4/4] IPC:Added entry in performance tools for new system call Date: Sun, 15 Mar 2026 09:38:00 +0530 Message-ID: <20260315040827.156558-5-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315040827.156558-1-academic1mathura@gmail.com> References: <20260315040827.156558-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