Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933293Ab0GUDob (ORCPT ); Tue, 20 Jul 2010 23:44:31 -0400 Received: from a-pb-sasl-quonix.pobox.com ([208.72.237.25]:36400 "EHLO sasl.smtp.pobox.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933266Ab0GUDoa (ORCPT ); Tue, 20 Jul 2010 23:44:30 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=pobox.com; h=subject:from:to :cc:in-reply-to:references:content-type:date:message-id :mime-version:content-transfer-encoding; q=dns; s=sasl; b=v2OR6l FBk3mV2KW7DJ+/TfqEBkE16s7izrysqS3r2QX7SExBtExiI9azWJf6j45ZDheHCq XKfLQS4zsdMrFtjEOq9s7ZlbzNePl7iqOAImMKE00QmlPrzKQ+md4KJIRvYyupgH T2Ayv90gwThSTMgZ1jVjP31lOaNvVHs56cQXA= Subject: Re: [PATCH] signalfd: fill in ssi_int for posix timers and message queues From: Nathan Lynch To: Andrew Morton Cc: Linux Kernel Mailing List , Davide Libenzi , stable@kernel.org In-Reply-To: <20100720154205.667e95aa.akpm@linux-foundation.org> References: <1278117528.21917.354.camel@localhost> <20100720154205.667e95aa.akpm@linux-foundation.org> Content-Type: text/plain; charset="UTF-8" Date: Tue, 20 Jul 2010 22:44:19 -0500 Message-ID: <1279683859.3030.121.camel@localhost> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 (2.28.3-1.fc12) Content-Transfer-Encoding: 7bit X-Pobox-Relay-ID: 413E587E-947A-11DF-A7E4-9056EE7EF46B-04752483!a-pb-sasl-quonix.pobox.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3431 Lines: 80 On Tue, 2010-07-20 at 15:42 -0700, Andrew Morton wrote: > On Fri, 02 Jul 2010 19:38:48 -0500 > Nathan Lynch wrote: > > > If signalfd is used to consume a signal generated by a POSIX interval > > timer or POSIX message queue, the ssi_int field does not reflect the > > data (sigevent->sigev_value) supplied to timer_create(2) or > > mq_notify(3). (The ssi_ptr field, however, is filled in.) > > > > This behavior differs from signalfd's treatment of sigqueue-generated > > signals -- see the default case in signalfd_copyinfo. It also gives > > results that differ from the case when a signal is handled > > conventionally via a sigaction-registered handler. > > > > So, set signalfd_siginfo->ssi_int in the remaining cases (__SI_TIMER, > > __SI_MESGQ) where ssi_ptr is set. > > > > This introduces an incompatibility between kernel versions. Someone > develops and tests an application on 2.6.36 or later then ships it and > lo, it malfunctions on 2.6.35 and earlier. > > Is there a way to avoid that? Don't think so. > > How should the more-awake-than-average application developer prevent > this problem? Should he probe the syscall at runtime to determine its > behaviour? He can't use the kernel version number because the kernel > provider might have backported this patch into an earlier kernel. > > We can minimise the problem by backporting into -stable, and hoping > that awake kernel packagers understand the issue, and backport the > change as far as they can. And perhaps document it in the signalfd man page. This was done for commit 0859ab5 "signalfd: fix for incorrect SI_QUEUE user data reporting", which seems to a be a similar case. > So it's not 100% obvious that this change is desirable. Does the > functionality which this patch adds justify the introduction of these > problems? I think the change is desirable in that no user of the interface could reasonably expect the current behavior with respect to the ssi_int field, and that it reconciles signalfd's behavior with its design intentions. On the other hand, I noticed this discrepancy only because I was cribbing signalfd's data structures for checkpoint/restart, not because I am aware of any application that is affected, nor was I able to find one using Google's code search. It would be highly speculative of me to say that no application depends on the current behavior, but it is difficult to imagine a correctly functioning application that depends on it. Davide, any opinion here? > > fs/signalfd.c | 2 ++ > > 1 files changed, 2 insertions(+), 0 deletions(-) > > > > diff --git a/fs/signalfd.c b/fs/signalfd.c > > index f329849..1c5a6ad 100644 > > --- a/fs/signalfd.c > > +++ b/fs/signalfd.c > > @@ -88,6 +88,7 @@ static int signalfd_copyinfo(struct signalfd_siginfo __user *uinfo, > > err |= __put_user(kinfo->si_tid, &uinfo->ssi_tid); > > err |= __put_user(kinfo->si_overrun, &uinfo->ssi_overrun); > > err |= __put_user((long) kinfo->si_ptr, &uinfo->ssi_ptr); > > + err |= __put_user(kinfo->si_int, &uinfo->ssi_int); > > break; > > hm, someone bollixed the __SI_TIMER indenting. In kernel/signal.c::copy_siginfo_to_user() too :) -- 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/