lkml.org 
[lkml]   [2010]   [Feb]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 37/41] CAPI: Clean up capiminor_*_ack
    Date
    No need for irqsave acquisition of acklock, bh-safe is sufficient.
    Moverover, move kfree out of the lock and do not take acklock at all
    in capiminor_del_all_ack as we are the last user of the list here.

    Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
    ---
    drivers/isdn/capi/capi.c | 19 +++++++------------
    1 files changed, 7 insertions(+), 12 deletions(-)

    diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c
    index 074496f..40b81b4 100644
    --- a/drivers/isdn/capi/capi.c
    +++ b/drivers/isdn/capi/capi.c
    @@ -149,7 +149,6 @@ static struct tty_driver *capinc_tty_driver;
    static int capiminor_add_ack(struct capiminor *mp, u16 datahandle)
    {
    struct ackqueue_entry *n;
    - unsigned long flags;

    n = kmalloc(sizeof(*n), GFP_ATOMIC);
    if (unlikely(!n)) {
    @@ -158,44 +157,40 @@ static int capiminor_add_ack(struct capiminor *mp, u16 datahandle)
    }
    n->datahandle = datahandle;
    INIT_LIST_HEAD(&n->list);
    - spin_lock_irqsave(&mp->ackqlock, flags);
    + spin_lock_bh(&mp->ackqlock);
    list_add_tail(&n->list, &mp->ackqueue);
    mp->nack++;
    - spin_unlock_irqrestore(&mp->ackqlock, flags);
    + spin_unlock_bh(&mp->ackqlock);
    return 0;
    }

    static int capiminor_del_ack(struct capiminor *mp, u16 datahandle)
    {
    struct ackqueue_entry *p, *tmp;
    - unsigned long flags;

    - spin_lock_irqsave(&mp->ackqlock, flags);
    + spin_lock_bh(&mp->ackqlock);
    list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) {
    if (p->datahandle == datahandle) {
    list_del(&p->list);
    - kfree(p);
    mp->nack--;
    - spin_unlock_irqrestore(&mp->ackqlock, flags);
    + spin_unlock_bh(&mp->ackqlock);
    + kfree(p);
    return 0;
    }
    }
    - spin_unlock_irqrestore(&mp->ackqlock, flags);
    + spin_unlock_bh(&mp->ackqlock);
    return -1;
    }

    static void capiminor_del_all_ack(struct capiminor *mp)
    {
    struct ackqueue_entry *p, *tmp;
    - unsigned long flags;

    - spin_lock_irqsave(&mp->ackqlock, flags);
    list_for_each_entry_safe(p, tmp, &mp->ackqueue, list) {
    list_del(&p->list);
    kfree(p);
    mp->nack--;
    }
    - spin_unlock_irqrestore(&mp->ackqlock, flags);
    }


    @@ -676,7 +671,7 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb)
    CAPIMSG_U16(skb->data, CAPIMSG_BASELEN+4+2));
    #endif
    kfree_skb(skb);
    - (void)capiminor_del_ack(mp, datahandle);
    + capiminor_del_ack(mp, datahandle);
    tty = tty_port_tty_get(&mp->port);
    if (tty) {
    tty_wakeup(tty);
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2010-02-08 21:17    [W:4.103 / U:0.336 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site