The patch titled Subject: signalfd: add ability to read siginfos without dequeuing signals has been removed from the -mm tree. Its filename was signalfd-add-ability-to-read-siginfo-s-without-dequeuing-signals-v4.patch This patch was dropped because it is obsolete ------------------------------------------------------ From: Andrey Vagin <avagin@xxxxxxxxxx> Subject: signalfd: add ability to read siginfos without dequeuing signals pread(fd, buf, size, pos) with non-zero pos returns siginfos without dequeuing signals. A sequence number and a queue are encoded in pos. pos = seq + SFD_*_OFFSET seq is a sequence number of a signal in a queue. SFD_PER_THREAD_QUEUE_OFFSET - read signals from a per-thread queue. SFD_SHARED_QUEUE_OFFSET - read signals from a shared (process wide) queue. This functionality is required for checkpointing pending signals. v2: llseek() can't be used here, because peek_offset/f_pos/whatever has to be shared with all processes which have this file opened. Suppose that the task forks after sys_signalfd(). Now if parent or child do llseek this affects them both. This is insane because signalfd is "strange" to say at least, fork/dup/etc inherits signalfd_ctx but not the" source" of the data. // Oleg Nesterov v3,v4: minor cleanups Signed-off-by: Andrey Vagin <avagin@xxxxxxxxxx> Cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: "Paul E. McKenney" <paulmck@xxxxxxxxxxxxxxxxxx> Cc: David Howells <dhowells@xxxxxxxxxx> Cc: Dave Jones <davej@xxxxxxxxxx> Cc: Andrey Vagin <avagin@xxxxxxxxxx> Cc: Michael Kerrisk <mtk.manpages@xxxxxxxxx> Cc: Pavel Emelyanov <xemul@xxxxxxxxxxxxx> Cc: Cyrill Gorcunov <gorcunov@xxxxxxxxxx> Cc: Michael Kerrisk <mtk.manpages@xxxxxxxxx> Reviewed-by: Oleg Nesterov <oleg@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/signalfd.c | 45 +++++++++++++++++++++++++++++++- include/uapi/linux/signalfd.h | 5 +++ 2 files changed, 49 insertions(+), 1 deletion(-) diff -puN fs/signalfd.c~signalfd-add-ability-to-read-siginfo-s-without-dequeuing-signals-v4 fs/signalfd.c --- a/fs/signalfd.c~signalfd-add-ability-to-read-siginfo-s-without-dequeuing-signals-v4 +++ a/fs/signalfd.c @@ -51,6 +51,44 @@ struct signalfd_ctx { sigset_t sigmask; }; +static ssize_t signalfd_peek(struct signalfd_ctx *ctx, + siginfo_t *info, loff_t *ppos) +{ + struct sigpending *pending; + struct sigqueue *q; + loff_t seq; + int ret = 0; + + if (*ppos >= SFD_SHARED_QUEUE_OFFSET) { + pending = ¤t->signal->shared_pending; + seq = *ppos - SFD_SHARED_QUEUE_OFFSET; + } else if (*ppos >= SFD_PER_THREAD_QUEUE_OFFSET) { + pending = ¤t->pending; + seq = *ppos - SFD_PER_THREAD_QUEUE_OFFSET; + } else + return -EINVAL; + + spin_lock_irq(¤t->sighand->siglock); + + list_for_each_entry(q, &pending->list, list) { + if (sigismember(&ctx->sigmask, q->info.si_signo)) + continue; + + if (seq-- == 0) { + copy_siginfo(info, &q->info); + ret = info->si_signo; + break; + } + } + + spin_unlock_irq(¤t->sighand->siglock); + + if (ret) + (*ppos)++; + + return ret; +} + static int signalfd_release(struct inode *inode, struct file *file) { kfree(file->private_data); @@ -249,7 +287,11 @@ static ssize_t signalfd_read(struct file siginfo = (struct signalfd_siginfo __user *) buf; do { - ret = signalfd_dequeue(ctx, &info, nonblock); + if (*ppos == 0) + ret = signalfd_dequeue(ctx, &info, nonblock); + else + ret = signalfd_peek(ctx, &info, ppos); + if (unlikely(ret <= 0)) break; @@ -339,6 +381,7 @@ SYSCALL_DEFINE4(signalfd4, int, ufd, sig } file->f_flags |= flags & SFD_RAW; + file->f_mode |= FMODE_PREAD; fd_install(ufd, file); } else { diff -puN include/uapi/linux/signalfd.h~signalfd-add-ability-to-read-siginfo-s-without-dequeuing-signals-v4 include/uapi/linux/signalfd.h --- a/include/uapi/linux/signalfd.h~signalfd-add-ability-to-read-siginfo-s-without-dequeuing-signals-v4 +++ a/include/uapi/linux/signalfd.h @@ -17,6 +17,11 @@ #define SFD_NONBLOCK O_NONBLOCK #define SFD_RAW O_DIRECT +/* Read signals from a shared (process wide) queue */ +#define SFD_SHARED_QUEUE_OFFSET (1LL << 62) +/* Read signals from a per-thread queue */ +#define SFD_PER_THREAD_QUEUE_OFFSET 1 + struct signalfd_siginfo { __u32 ssi_signo; __s32 ssi_errno; _ Patches currently in -mm which might be from avagin@xxxxxxxxxx are signal-allow-to-send-any-siginfo-to-itself.patch signal-allow-to-send-any-siginfo-to-itself-fix.patch signalfd-add-ability-to-return-siginfo-in-a-raw-format-v2.patch signalfd-add-ability-to-return-siginfo-in-a-raw-format-v2-fix.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html