xfs
[Top] [All Lists]

Re: 3.14-rc2 XFS backtrace because irqs_disabled.

To: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
Subject: Re: 3.14-rc2 XFS backtrace because irqs_disabled.
From: Al Viro <viro@xxxxxxxxxxxxxxxxxx>
Date: Wed, 12 Feb 2014 21:14:22 +0000
Cc: Dave Chinner <david@xxxxxxxxxxxxx>, Dave Jones <davej@xxxxxxxxxx>, Eric Sandeen <sandeen@xxxxxxxxxxx>, Linux Kernel <linux-kernel@xxxxxxxxxxxxxxx>, xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <CA+55aFywwx0Q8xK2GJiRJ+FV7PQEKoBRxDUxW4052FVyd5XOpg@xxxxxxxxxxxxxx>
References: <52FA9ADA.9040803@xxxxxxxxxxx> <20140212004403.GA17129@xxxxxxxxxx> <20140212010941.GM18016@xxxxxxxxxxxxxxxxxx> <CA+55aFwoWT-0A_KTkXMkNqOy8hc=YmouTMBgWUD_z+8qYPphjA@xxxxxxxxxxxxxx> <20140212040358.GA25327@xxxxxxxxxx> <20140212042215.GN18016@xxxxxxxxxxxxxxxxxx> <20140212054043.GB13997@dastard> <CA+55aFxy2t7bnCUc-DhhxYxsZ0+GwL9GuQXRYtE_VzqZusmB9A@xxxxxxxxxxxxxx> <20140212113928.GO18016@xxxxxxxxxxxxxxxxxx> <CA+55aFywwx0Q8xK2GJiRJ+FV7PQEKoBRxDUxW4052FVyd5XOpg@xxxxxxxxxxxxxx>
Sender: Al Viro <viro@xxxxxxxxxxxxxxxx>
User-agent: Mutt/1.5.21 (2010-09-15)
On Wed, Feb 12, 2014 at 12:13:19PM -0800, Linus Torvalds wrote:
> On Wed, Feb 12, 2014 at 3:39 AM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote:
> > On Tue, Feb 11, 2014 at 10:28:12PM -0800, Linus Torvalds wrote:
> >
> >> It looks like just "do_signal()" has a stack frame that is about 230
> >> bytes even under normal circumstancs (largely due to "struct ksignal"
> >> - which in turn is largely due to the insane 128-byte padding in
> >> siginfo_t). Add a few other frames in there, and I guess that if it
> >> was close before, the coredump path just makes it go off.
> >
> > We could, in principle, put it into task_struct and make get_signal()
> > return its address - do_signal() is called only in the code that does
> > assorted returns to userland...
> 
> We have better uses for random buffers in "struct task_struct", I'd
> hate to put a siginfo_t there.

*nod*

> The thing is, siginfo_t has that idiotic 128-byte area, but it's all
> "for future expansion". I think it's some damn glibc disease - we've
> seen these kinds of insane paddings before.
> 
> The actual *useful* part of siginfo_t is on the order of 32 bytes. If that.
> 
> Sad.

Umm...  What if we delay __sigqueue_free()?  After all, that's where the
fat sucker normally comes from.  That way we might get away with much
smaller structure on stack...

Just introduce a small structure that would contain signr, uid, pid and
pointer to struct sigqueue.  And pass a pointer to _that_ all the way down
to collect_signal().  Pointer's NULL == it's SI_USER with signr/uid/pid
from the small struct and all other fields are zero.  Pointer isn't NULL -
use &small_struct->p->info.  And have struct sigqueue actually freed
via task_work_add() in that case.

Do you see any fundamental problems with that?  Looks like it would be
faster as well - less copying involved...


<Prev in Thread] Current Thread [Next in Thread>