From nobody Tue Apr 7 06:22:56 2026 Received: from mail-pg1-f171.google.com (mail-pg1-f171.google.com [209.85.215.171]) (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 7D66F374E68 for ; Sun, 15 Mar 2026 21:47:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611258; cv=none; b=Tr/M6edyAdgtPZzZjzY83kpapK+XUGfJvpZvCzekakDzwveviHGubT7PLKKoZnegiSI5GTM9GfIVAs9qz7esYkdrf/UGFeRJdugJBQDqMCFhXMZ3MXrGxmyTSMwaodKohGmJikLV6PVRiBLuwFkbCiXs3Dg5xGIth7uUahI1DmU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611258; c=relaxed/simple; bh=RLab7y+WF7eTkkWgtNJDfg2TaHxCj/lPEIM7ZFRMteE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UuiAXbNqBXtOK5L92dtoRUxDRakrSvvg/1ADGxrgMehwdAFJ8jibTpyBhdKMlLdnx8KO+alo0rSqGcxWzoxsoY/H6DAc5S6Ne8HJEwpg+UK9GgSm4OfCdD0cfg9xuv1vJbfLa31/E+vEIC2uofybQDWilp87LEnga7I0nQt5Wcs= 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=L2luHoEG; arc=none smtp.client-ip=209.85.215.171 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="L2luHoEG" Received: by mail-pg1-f171.google.com with SMTP id 41be03b00d2f7-c73d251b93bso1612790a12.0 for ; Sun, 15 Mar 2026 14:47:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773611257; x=1774216057; 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=L2luHoEG6ATMj4gSDzAQ1rM++vWLpYI6aIR/+DzuUjWTbS+A7e6dwHtaccmNPktcC7 iPHsuRwfU+j9rW9jnhOCrkmlWmNg8ifkzq2OKLiUEaH0Po/eUNrMw+M/jw2RjJp2Gzqj wIvNL64gsl7CA5zzw35MlRxWxoY0QptkE5aLu+0vTLyUH5rs1UrF4YAL1GBqutVk24a9 Sc/Lr+flB76rdgFvSfCn2QcKD+O/I2DkdqztuLX4cTX9+CuPg0igfk8uogT0IGN2Sdar B/IiB5ZFyCh+xLuhtR73ZFOHizhm8NxD7nBNPPqN9nDpXZNhm79LfxZawX3wlVDb7lZs Vh3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773611257; x=1774216057; 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=BIFLBnuoXUUB18tiMENdLYc65Js0vQYKulcGzEbXDYWZomUTha7auBybKaDSGfhdwj FJMlgPDnXtqLwczz6O+GsW8zuaqnO1uFt3IkrhfCRH4ZXW31tXNj1/i1GaWxz4fcsahg xhGcHkPOgbXu6sLwFxLy8Ts4bl4UivHGUocxHR+XjdhiStreyM8yEOAqx+Efu+M4bIQA h7VBJU4wVG5tre+sPyjSY+Dja3N8GHDSXy4emGL4CmZhsr3V5bwc4tlxvr7Kk62DV2iC taG4qmBgYbGslEhpLbsWGV+UYudbIYXuyZ4S+MK3l9VbsL0lqK8G/JsWT689BEO1Kde1 MSbw== X-Forwarded-Encrypted: i=1; AJvYcCVnocXUNUg8UxRT7jkD5LNYQ1Dhfdkw1iGH5bOkl6JuilzHh5Y9wpkbh+iiIXHQ/3Mc4A0RjEXLYHcYBR4=@vger.kernel.org X-Gm-Message-State: AOJu0YyZdpWME1BJvl9Z4SW5nLJTquu5jK7eZxWXvkeeMYMbPXFUswKZ wOFr7CPP5Y3sUrrHSK576lrQqJVmhwhXdsPWJQo2tk2rzYuIxby7Be3U X-Gm-Gg: ATEYQzxqaYbCHstSWYk4lUXdW+TXfRUQMD+Y9Vc/ioVm0oLABF1sCRY5/vqWWj/1uSz evKCZTXhb2ju+yz0wXCjFFtOegSGPmLZFMm+SeNkoiMoHfn6BxIowJtYce+t0Y/nBfQfGxvgDBc iV2vU8vrJR2p+Fk/VRLq9k2fILPmRUe5ozlvkDD6aSKLe/MJHSn88CbChjPM5834i3AtBCJVy6m I8SA2+6m5pQBFTHlTe/hSgT5xZzG1t5MwCU4j1dZU6d7AneGX/+N8Tod+CH601XYp09yjbya8VV nuXEzW57fpQILdpuckphwdxp2HFsSbTvnkPww2giN1Vs93AZnRC6Lv4uNqY6TlCvrH69523O4DY AyP1O9TyCMZkg2QZQY7V+kMsFQb8VtbK7fcJ1RvsjMSpj6jZnXQuzOBfUhxjribT/X5EVYlV3Fd h3ybhvdZ5XFFz5/qnjBTzUXDdBlFbLDtc98e4= X-Received: by 2002:a17:902:cf4a:b0:2b0:5450:a9cd with SMTP id d9443c01a7336-2b05450ac37mr20586045ad.21.1773611256804; Sun, 15 Mar 2026 14:47:36 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b4fc:c14c:ba99:ba0e:908b:8404]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b04f40f515sm34153085ad.74.2026.03.15.14.47.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2026 14:47:36 -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 v2 1/4]IPC: Added New system call do_mq_timedreceive2() for non-destructive peek on posix mqueue Date: Mon, 16 Mar 2026 03:16:51 +0530 Message-ID: <20260315214656.658590-2-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315214656.658590-1-academic1mathura@gmail.com> References: <20260315214656.658590-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 Tue Apr 7 06:22:56 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (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 4AFF037BE6F for ; Sun, 15 Mar 2026 21:47:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611265; cv=none; b=WO7t1HYZXSYFnhAC+2yIGbnJcH0czE1H5qhljGUAPMfS8IUU7KsoiGaez0FSGCJxhlEjYKxr/kLqO7TR/9xxBX7BDJH9T9a5a9r0G+7YjTywXrJ4IrgLVYC5Hd31Qu2hNqux6BEmatIBpjitd+KlhTkVsIUil/AlVwpL0rlGvWU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611265; c=relaxed/simple; bh=goBBsTk2MYrix5HgSc5P3EgwATIoXdXN56gmrYzwOzE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gJ6H311zI1HokR+uLEwdLlZ1AFZ+SMKnTlFKc5GQylaS9aXFqIIDNsdusAJkbU5WNpC/V03TeQA5sFqdCFZc5YbKX5ubAvtjTd5HXZBH7+WzmFXMBHgE2OWUajLQ0KpwD6Z4vq9CUx2OJLCBiNXeQ8djRqOLGtIVEaCLfzuuhVc= 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=lSuywpPd; arc=none smtp.client-ip=209.85.216.43 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="lSuywpPd" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-35a02f3b8feso1530091a91.3 for ; Sun, 15 Mar 2026 14:47:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773611264; x=1774216064; 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=lSuywpPdoSNJ+YC3oYdM+eWlimbFzTxrJ/20bKjBWyubm9c/XzbXmktQCG++xceHMG 7QN5N2a9lCJZaPPKp7I8Cm3sFKxEV8t1ybZDrj/zp+hBdX3MOzeQWBkFpJCGgdLRZmCn naE47ZVOaqGtPAHkq+9PT2XvMI1KNd5bFVO1L2vlHQ+iEO+ya0R2T3keZtmXs7/nEGiR xUmL0HTB+tmW6vUfi7VYwGDJXEJyaV4NSa3sd5s1v/OUM59S0QHKQq8e27l6+QIp8ygl r56baUk/34LEdZOAd87Y2EGiTKo73+gS4/EW2ZqqWQJS3UlT5AYYD2UKSKViYByuuLAe aoeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773611264; x=1774216064; 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=LRgqIzeyoSPdzBMsMQ2VhIu4XKdnjZpHjgpsRKxQdz2Nk3wSSp2MH1YXW8eGskqO2E DfSAkeSp9W7u1ysjnf2fg38utAHGdpEF8sW58L0g/Um+0LsCk2fRc82vbgqkUiWac/Ad 9TYJslveq0unvbh4ROp/fs1bjP9xwQhYg/8gb1YYibQEVJxwk5zVbz3EcNCmr57DDWcC TNIm8BGrCvxbOd1AvQGjkeL0prUWOqDX6G/RTjBtxzxhg1gVkw71WcLUXx3FYbO0kMN8 RkV651GCAvVN6+evXNFogP+GgZjt3a61MuT/blf1SrsVxqoIm8TyRO+SjTRt1S23IYFF coig== X-Forwarded-Encrypted: i=1; AJvYcCUi3JY7cgVPaiHwT6cHmr86T4UsHiJvxgiKr1GQlIbjZa3AzJxF97gxABf0b/PBpTZ+ExgXMHbFqcYwGhw=@vger.kernel.org X-Gm-Message-State: AOJu0YzJkzYHkg+qAMvOg4IuZ9HT0khZFQ8ReSWjuLB6hKjj6MYkU8UH nx3yE3MsGRRVtrjhz6N4R7tRTlaQKEAKQRa91T3JLRISmZf3gknMFiXy59pMoA== X-Gm-Gg: ATEYQzxUsCc8p2l5QiUw0o7TM4WGWuPBn5WExeSMkmn7+/4L4uHCOWBeJupLhIedFIx rghmQ7HJ6P2JT8/MiaaQOM3lAUm/ikFtfprQYRdSWRu1aRRzYv5IMPCMNoLyRKf1SpLn3+MJ4ft InvxqqOnAI7SstWMKxnmY658LTYelTX8FBTAz1E4c5WqxHq19aAIepMpA54aVcpk3ptW5y4Ou3q 4w1nsHkA4516d1IjQx0l8Eiy7QXXvsMOxlT+Rd7YD2KAxVjAF70XDmWG7y3SG7Znba296pNwFsK 6DVoHNvD0vzGRUwtS0WHQl5GksCxs2oofj7jlB3cQo5uvaP6LnUogUEB4dvXszx6vL2qIKiEpvz lFBMCUI74AlnzxCPb2A48NYTTHw45ctLXkWAvT0P1KQd6G1dg49/6eDskYM2UNSZgEnapEBT3le kKlXB9yAzr4acTjox9PMjtN/kwmsQQX1LHZFU= X-Received: by 2002:a17:902:e810:b0:2b0:5a4c:7265 with SMTP id d9443c01a7336-2b05a5bc019mr5279345ad.4.1773611263651; Sun, 15 Mar 2026 14:47:43 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b4fc:c14c:ba99:ba0e:908b:8404]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b04f40f515sm34153085ad.74.2026.03.15.14.47.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2026 14:47:43 -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 v2 2/4]IPC: Added system call number in all most common arch. Date: Mon, 16 Mar 2026 03:16:52 +0530 Message-ID: <20260315214656.658590-3-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315214656.658590-1-academic1mathura@gmail.com> References: <20260315214656.658590-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 06:22:56 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 3F61C37754B for ; Sun, 15 Mar 2026 21:47:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611273; cv=none; b=VWkgaal/jStdOoNB43UU2OfrC+fQV2116zzugWd8SYtjZGioxidAG2AuRgKu7UzUnACqWfVfV2tjZVuamHA1A069g8QlQnQSzt9IDmrTAUD35viifkFfOlDwXnviMJbzzYN/Xe9N7lcQS5yO7btEu/+0did2N0jVwB+gh/XbNP4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611273; c=relaxed/simple; bh=/DeFAgUlo+qfAIACLhOuCQe8PHw7H0K7rpvGU0P4cFE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TfEndgYnTPEt4KzSxTjXvLtscFwlsKBGFDIqX1rt8Uc0uqA5C7YIhbHAEVV1IRf2Lde/4rQJivIm7pdqJqEvfLgsWMSJBWUD6GBG9jXOf/kXv5BbmwS8jauq14vGtrwblskx584rFxdHUvDSvkSHy5uS5EPpP4Gox0nf131Xv54= 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=VWm+j7sN; arc=none smtp.client-ip=209.85.214.179 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="VWm+j7sN" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2ae3a2f6007so29661935ad.2 for ; Sun, 15 Mar 2026 14:47:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773611271; x=1774216071; 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=VWm+j7sNUbhxIh7CWnmTnyIH0rhYVe+nkrAoh1FdM4VXoQ1FKbIbIbgUviuf4whVrL /URWq6DOwOoGZY+hprcywyvCIrdeYPs4TLAZD8FLhiZzE0rsQQbQaSkPYmaMGQ3CY1fg S97mUQQ8OQxpYaI3wqrJYnvMjOylrG2lNrFG9Z5XQEoCz5PMXtptzlxUkFzQEAQ1yaBA dN3fHOELUlNyLAfAAKp0e3badIT2ySQQBIBPnCErbAtmlwRy7x461OrLSgk9n5yEYfXc 7YHEoggef/4Dr9ESU4r7+bFKiRD0R4bOU/4hXGBu1dqqdP87GhR9RRo3PT6QXscqfoqK rZPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773611271; x=1774216071; 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=f/WsfAh4MQlFxuN/owCMDPC+uZaYtf9Ct5F0P0ghH1y0AQpVfaUhPw3D3Yd/uhcPns 3ooA3hQkxG4vRyX4VUGSXfu6cmI9chA3R0CgCDJTHKBCADusOs6+hxWYjJ3YZ9BUtUbR qAZnWgLAxOX8K886lo+7SUYeAOkNEaWw3RE2xUq3R8SMaAZC6Wx3VUQHoZSejCjAzHSF gZev0ldECeDgNNSMTY0WeVwdSDGr/RS4bPOfx2wWk1H+6xtbjO0u4jAMyl8qyIkNrx25 ZlEVb4ZIvDn1UwRfI2LUEH2vuaosnUIzI/8qUm4tOIKO+PiICnN5HxYpWq0dhCTTwrPY dgYA== X-Forwarded-Encrypted: i=1; AJvYcCXBH08Gp9Noi8KfhDIOuhUDRXzaYbnLcBY5609TRiAtEhDXFlHMAOerquPcCA/AorhHphSbj3aU1cmHK+c=@vger.kernel.org X-Gm-Message-State: AOJu0YzeLyBa/SSN/8apO5ZWNE7A7iKog3ezQB9r6ntMCE5P4gTCWxpH S85oWu8OHmgh7PCwdLHDqkxVHtZJnEcbjGjiOAQPoF2YFfT/dy32InVQ X-Gm-Gg: ATEYQzwOL1koneJUAeAjAAhEslvlpDPXiF+IsCBPLNkN3CGRJ1gChS7YXSZ2dXuQOxk SuINb7vkfn0XBSZDYFpcmzQCYj2r21dNaqwEXmaeZqyqzBGnqXJJ03zr/IsG0y+jF6Q6SxuhWc/ kiXLlfCThUVgLU36881/EcRYoFeAsifNxmSjNYLeAneH2Di7xtHnybSgE76Rl1FjYd2Rzt2k9Qf fgy8lgEbmU5WHtZi19h6ZU7oRMeu1zGMzSLxHMYQkI5BzStRRkTBCXYFkcLe0Jq8rUc+ZI57MUa IqqvlwoFTgR45QXRSxuB4Rtcl1+ImDh+cuwVlzJ5wjKWn4R8pMEYAkbBjeN11AgLxVZUrDODZDm wmB7wf6rtJpoRGREM1HhKIoUilq64WD6w6FR2BKUlTIgv6VvxwX36BGntFopP2Kii4MLfx0gHK1 v3iSuF8E/54nY8DvCJQX3hxk5lqKB+uQbR08k= X-Received: by 2002:a17:902:e850:b0:2ae:ba5f:3ac3 with SMTP id d9443c01a7336-2aeca9a961cmr117534205ad.2.1773611270419; Sun, 15 Mar 2026 14:47:50 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b4fc:c14c:ba99:ba0e:908b:8404]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b04f40f515sm34153085ad.74.2026.03.15.14.47.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2026 14:47:50 -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 v2 3/4]IPC: Prepared Documentation and test Date: Mon, 16 Mar 2026 03:16:53 +0530 Message-ID: <20260315214656.658590-4-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315214656.658590-1-academic1mathura@gmail.com> References: <20260315214656.658590-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 06:22:56 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 EC03F378D78 for ; Sun, 15 Mar 2026 21:47:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611277; cv=none; b=P8ov8YY9GaI4Clv6bjxlYyeHWWxXW/vSPYKn9jM0yfplbRN/dI3PIMB3D+J8SN67y9M4L27ROMHdv7EjwRf3LXZlN4treEXzjjlt942bhidN82pWdLfs2iB+ORNSOoLLMFLx1v47wlMgf6VUYJu3cG1RYhAAJDv/mige6ab5f44= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773611277; c=relaxed/simple; bh=bBQ8eU9COzhoiSE8iroJ9UrjlJbEQHeRPmWx2f4Tifw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=j/GUNiR/FhbKJOrne27bX2RMIhDHhBIYFAXSTkIlOrIXzPpJQN4tvP72M4S68aWCCI6g9H3eFCTSLQpjZXDpyXjiE2sVL+TQy+liJGYkXrKK5qfq0P2ubp9A/p8JZqrP574zrgoAFRJwOcIL/PT1QNCbCF9R/qxxBpuIXTCsQ9U= 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=e3taf9ac; arc=none smtp.client-ip=209.85.214.179 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="e3taf9ac" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2ad617d5b80so27280435ad.1 for ; Sun, 15 Mar 2026 14:47:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1773611275; x=1774216075; 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=e3taf9accPmWURAzYG469Eru5nh/a2tRQLQyqnquUI2UtDGRg58JaNdlmgA1Omy9m+ OHujSonoGBsgIgjNHEt4LZxB1ytoKAmMLxzOwjTrAf5uPNfEbWgqzSLtYSUQ2xBd8OzY bPt3e12NMepz8MYC698vSXJTCkygzSxplTG2djSqvAqznfypI+oXJU30ZSf7+EYlIlUZ zeK3w6JNjBOO5lSzMcIM451o/Ss/heP0U6MBYPbBMoINEaCW5DIHWbrFjhvP2lIRB9BQ LUM7m1bVpHqRt1q39BmYxqHCZH7GQDHoXXBHScUZwS3ySv6U2i38D9QMnz/QRR0Gl7kI mAzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773611275; x=1774216075; 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=BzO+lGIQR+my3R7/3DEL7zcdKpn/7angOo+v4z3CU6nx79o375V+kEJCvLgQrCZT6v 7dZMuEWCViL+NgPrDA8EJxD3eJzl3iGdFn3H4ltA2PuvbX5Itw34izi0Oz2oBX5m5ydU Iyw00WHAKZIvrkFm0STpHoGVsmBIVAkkWsMz4f36nb7QVHu/X5ixQNWQXjQ+qLCsQKw+ 2wBzuL7oK9cPB0qj5veGxhX6dXevEOROVYfJY+Cpjfu5S3VnFxIbUpcvvqAWyTxv2QTf 4yXEBvGyMj+mXDuRlCMu+e1MUNLgiv8GAlJz+4+hwLSM3wq/hIXZu07twt+ghLOGWJGk 01dg== X-Forwarded-Encrypted: i=1; AJvYcCUIA6OrsDTJznup0NqGeWBp90fa9TuO3GzGo5xtsaIyjxGLnb9FWhnXP2qwoDtghZsO+d8uyw+stk7Po5o=@vger.kernel.org X-Gm-Message-State: AOJu0YxuZqYUPy6jwRt7L1fLQAVJm3iWVz+dPQ2wZ1/wBVPhb3WJcv7C j3jjHiIifz8v1eteWHuGJGaHCKf8P+RPSfXg7avFCSEVzpXsMxDqIyHS X-Gm-Gg: ATEYQzyZ4vkCELfUKUW8IYVuQAIv5btRkZ3Cp2JRTC/ZlDnCxYfL8wb0mB/rS/ttYOA vFXNPeXA9l30Oq5mPl7p24+fVIe3c3eXY9Sxt4MZrjCGd8FXwi2CmsT5AJBUL6mN46sIs/waNFt G3WPhsiJZqXjumDTbBcz2KFxoPQyq/5LZgGdXygP2SOM3EDBzB9+rpZYce33xUphKG9QvIclgWK s2xSoTFBU+HzXvC6Ge9A4BjbZagPuw1KH4Z6PZO2uSD9sat8OI2QgAzuWqjvG/R/A+9iucAF5wT ua4albncbPQ++O9tqAQ0sbLvXpF4awlH8ZRd6rxfDh7vtWCdqC4bZ8Cxcgj6T+pqLroygEqObfR A4ehp1XQoC7OiMinV0aIfOO+Ccm6SM5fdJJ1dbBXnw4yf18ZdvrLlLG4k64cUSc/jFKgEBRvp23 72p+o/7iAcwCjn47a+9v38PxsmzplQCscZFa0= X-Received: by 2002:a17:902:daca:b0:2b0:5520:f4a0 with SMTP id d9443c01a7336-2b055210ab4mr19571845ad.11.1773611275367; Sun, 15 Mar 2026 14:47:55 -0700 (PDT) Received: from Modern-15.. ([2401:4900:b4fc:c14c:ba99:ba0e:908b:8404]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b04f40f515sm34153085ad.74.2026.03.15.14.47.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 15 Mar 2026 14:47:55 -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 v2 4/4]IPC:Added entry in performance tools for new system call Date: Mon, 16 Mar 2026 03:16:54 +0530 Message-ID: <20260315214656.658590-5-academic1mathura@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260315214656.658590-1-academic1mathura@gmail.com> References: <20260315214656.658590-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