Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934352AbXFFBD4 (ORCPT ); Tue, 5 Jun 2007 21:03:56 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S933522AbXFFBDs (ORCPT ); Tue, 5 Jun 2007 21:03:48 -0400 Received: from alnrmhc14.comcast.net ([204.127.225.94]:61789 "EHLO alnrmhc14.comcast.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933532AbXFFBDr (ORCPT ); Tue, 5 Jun 2007 21:03:47 -0400 Subject: signalfd API issues (was Re: [PATCH/RFC] signal races/bugs, losing TIF_SIGPENDING and other woes) From: Nicholas Miell To: Davide Libenzi Cc: Benjamin Herrenschmidt , Linus Torvalds , Linux Kernel list , Andrew Morton , Paul Mackerras In-Reply-To: References: <1181006711.31677.97.camel@localhost.localdomain> <1181009413.31677.117.camel@localhost.localdomain> <1181013756.31677.123.camel@localhost.localdomain> <1181023787.2785.14.camel@entropy> <1181028453.31677.127.camel@localhost.localdomain> <1181087462.2788.8.camel@entropy> <1181088936.2788.10.camel@entropy> Content-Type: text/plain Date: Tue, 05 Jun 2007 17:58:43 -0700 Message-Id: <1181091523.2788.28.camel@entropy> Mime-Version: 1.0 X-Mailer: Evolution 2.10.1 (2.10.1-4.fc7.0.njm.1) Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3278 Lines: 80 On Tue, 2007-06-05 at 17:37 -0700, Davide Libenzi wrote: > On Tue, 5 Jun 2007, Nicholas Miell wrote: > > > On Tue, 2007-06-05 at 17:11 -0700, Davide Libenzi wrote: > > > On Tue, 5 Jun 2007, Nicholas Miell wrote: > > > > > > > Yes, that's certainly wrong, but that's an implementation issue. I was > > > > more concerned about the design of the API. > > > > > > > > Naively, I would expect a reads on a signalfd to return either process > > > > signals or thread signals targeted towards the thread doing the read. > > > > > > > > What it actually does (delivering process signals or thread signals > > > > targeted towards the thread that created the signalfd) is weird. > > > > > > > > For one, it means you can't create a single signalfd, stick it in an > > > > epoll set, and then wait on that set from multiple threads. > > > > > > In your box threads do share the sighand, don't they? :) > > > > > > > I have no idea what you're trying to say, but it doesn't appear to > > address the issue I raise. > > "For one, it means you can't create a single signalfd, stick it in an > epoll set, and then wait on that set from multiple threads." > > Why not? > A signalfd, like I said, is attached to the sighand, that is shared by the > threads. > > POSIX requires the following: "At the time of generation, a determination shall be made whether the signal has been generated for the process or for a specific thread within the process. Signals which are generated by some action attributable to a particular thread, such as a hardware fault, shall be generated for the thread that caused the signal to be generated. Signals that are generated in association with a process ID or process group ID or an asynchronous event, such as terminal activity, shall be generated for the process." In practice, this means that signals like SIGSEGV/SIGFPE/SIGILL/etc. and signals generated by pthread_kill() (i.e. tkill() or tgkill()) are directed to a specific threads, while other signals are directed to the process as a whole and serviced by any thread that isn't blocking that specific signal. Linux accomplishes this by having two lists of pending signals -- current->pending is the per-thread list and current->signal->shared_pending is the process-wide list. dequeue_signal(tsk, ...) looks for signals first in tsk->pending and then in tsk->signal->shared_pending. sys_signalfd() stores current in signalfd_ctx. signalfd_read() passes that context to signalfd_dequeue, which passes that that saved task_struct pointer to dequeue_signal. This means that a signalfd will deliver signals targeted towards either the original thread that created that signalfd, or signals targeted towards the process as a whole. This means that a single signalfd is not adequate to handle signal delivery for all threads in a process, because signals targeted towards threads other than the thread that originally created the signalfd will never be queued to that signalfd. Is my analysis wrong? -- Nicholas Miell - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/