• Davidlohr Bueso's avatar
    ipc/msg: avoid waking sender upon full queue · ed27f912
    Davidlohr Bueso authored
    Blocked tasks queued in q_senders waiting for their message to fit in the
    queue are blindly awoken every time we think there's a remote chance this
    might happen.  This could cause numerous (and expensive -- thundering
    herd-ish) bogus wakeups if the queue is still really full.  Adding to the
    scheduling cost/overhead, there's also the fact that we need to take the
    ipc object lock and requeue ourselves in the q_senders list.
    
    By keeping track of the blocked sender's message size, we can know
    previously if the wakeup ought to occur or not.  Otherwise, to maintain
    the current wakeup order we just move it to the tail.  This is exactly
    what occurs right now if the sender needs to go back to sleep.
    
    The case of EIDRM is left completely untouched, as we need to wakeup all
    the tasks, and shouldn't be playing games in the first place.
    
    This patch was seen to save on the 'msgctl10' ltp testcase ~15% in context
    switches (avg out of ten runs).  Although these tests are really about
    functionality (as opposed to performance), is does show the direct
    benefits of the optimization.
    
    [akpm@linux-foundation.org: coding-style fixes]
    Link: http://lkml.kernel.org/r/1469748819-19484-6-git-send-email-dave@stgolabs.netSigned-off-by: default avatarDavidlohr Bueso <dbueso@suse.de>
    Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Cc: Manfred Spraul <manfred@colorfullife.com>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ed27f912
msg.c 23.3 KB