lkml.org 
[lkml]   [2013]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5/8] audit: efficiency fix 2: request exclusive wait since all need same resource
    Date
    author: Dan Duval <dan.duval@oracle.com>

    These and similar errors were seen on a patched 3.8 kernel when the
    audit subsystem was overrun during boot:

    udevd[876]: worker [887] unexpectedly returned with status 0x0100
    udevd[876]: worker [887] failed while handling
    '/devices/pci0000:00/0000:00:03.0/0000:40:00.0'
    udevd[876]: worker [880] unexpectedly returned with status 0x0100
    udevd[876]: worker [880] failed while handling
    '/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1/event1'

    udevadm settle - timeout of 180 seconds reached, the event queue
    contains:
    /sys/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1/event1 (3995)
    /sys/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/INT3F0D:00 (4034)

    audit: audit_backlog=258 > audit_backlog_limit=256
    audit: audit_lost=1 audit_rate_limit=0 audit_backlog_limit=256

    The change below increases the efficiency of the audit code and prevents it
    from being overrun:

    Use add_wait_queue_exclusive() in wait_for_auditd() to put the
    thread on the wait queue. When kauditd dequeues an skb, all
    of the waiting threads are waiting for the same resource, but
    only one is going to get it, so there's no need to wake up
    more than one waiter.

    See: https://lkml.org/lkml/2013/9/2/479

    Signed-off-by: Dan Duval <dan.duval@oracle.com>
    Signed-off-by: Chuck Anderson <chuck.anderson@oracle.com>
    Signed-off-by: Richard Guy Briggs <rgb@redhat.com>
    ---
    kernel/audit.c | 2 +-
    1 files changed, 1 insertions(+), 1 deletions(-)

    diff --git a/kernel/audit.c b/kernel/audit.c
    index 25fab2d..990d02f 100644
    --- a/kernel/audit.c
    +++ b/kernel/audit.c
    @@ -1061,7 +1061,7 @@ static unsigned long wait_for_auditd(unsigned long sleep_time)
    unsigned long timeout = sleep_time;
    DECLARE_WAITQUEUE(wait, current);
    set_current_state(TASK_UNINTERRUPTIBLE);
    - add_wait_queue(&audit_backlog_wait, &wait);
    + add_wait_queue_exclusive(&audit_backlog_wait, &wait);

    if (audit_backlog_limit &&
    skb_queue_len(&audit_skb_queue) > audit_backlog_limit)
    --
    1.7.1


    \
     
     \ /
      Last update: 2013-09-18 21:21    [W:3.138 / U:0.808 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site