lkml.org 
[lkml]   [2010]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 24/31] CAPI: Use atomics for capiminor's datahandle and msgid
    The capiminor members datahandle and msgid are incremented outside any
    lock, so better do this atomically.

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

    diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c
    index b8019a1..6ab496c 100644
    --- a/drivers/isdn/capi/capi.c
    +++ b/drivers/isdn/capi/capi.c
    @@ -88,10 +88,10 @@ struct capiminor {
    unsigned int minor;
    struct dentry *capifs_dentry;

    - struct capi20_appl *ap;
    - u32 ncci;
    - u16 datahandle;
    - u16 msgid;
    + struct capi20_appl *ap;
    + u32 ncci;
    + atomic_t datahandle;
    + atomic_t msgid;

    struct tty_struct *tty;
    struct mutex ttylock;
    @@ -222,7 +222,6 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci)

    mp->ap = ap;
    mp->ncci = ncci;
    - mp->msgid = 0;
    INIT_LIST_HEAD(&mp->ackqueue);
    spin_lock_init(&mp->ackqlock);

    @@ -396,7 +395,7 @@ gen_data_b3_resp_for(struct capiminor *mp, struct sk_buff *skb)
    capimsg_setu16(s, 2, mp->ap->applid);
    capimsg_setu8 (s, 4, CAPI_DATA_B3);
    capimsg_setu8 (s, 5, CAPI_RESP);
    - capimsg_setu16(s, 6, mp->msgid++);
    + capimsg_setu16(s, 6, atomic_inc_return(&mp->msgid));
    capimsg_setu32(s, 8, mp->ncci);
    capimsg_setu16(s, 12, datahandle);
    }
    @@ -509,7 +508,7 @@ static int handle_minor_send(struct capiminor *mp)
    }

    while ((skb = skb_dequeue(&mp->outqueue)) != NULL) {
    - datahandle = mp->datahandle;
    + datahandle = atomic_inc_return(&mp->datahandle);
    len = (u16)skb->len;
    skb_push(skb, CAPI_DATA_B3_REQ_LEN);
    memset(skb->data, 0, CAPI_DATA_B3_REQ_LEN);
    @@ -517,7 +516,7 @@ static int handle_minor_send(struct capiminor *mp)
    capimsg_setu16(skb->data, 2, mp->ap->applid);
    capimsg_setu8 (skb->data, 4, CAPI_DATA_B3);
    capimsg_setu8 (skb->data, 5, CAPI_REQ);
    - capimsg_setu16(skb->data, 6, mp->msgid++);
    + capimsg_setu16(skb->data, 6, atomic_inc_return(&mp->msgid));
    capimsg_setu32(skb->data, 8, mp->ncci); /* NCCI */
    capimsg_setu32(skb->data, 12, (u32)(long)skb->data);/* Data32 */
    capimsg_setu16(skb->data, 16, len); /* Data length */
    @@ -531,7 +530,6 @@ static int handle_minor_send(struct capiminor *mp)
    }
    errcode = capi20_put_message(mp->ap, skb);
    if (errcode == CAPI_NOERROR) {
    - mp->datahandle++;
    count++;
    mp->outbytes -= len;
    #ifdef _DEBUG_DATAFLOW
    --
    1.6.0.2


    \
     
     \ /
      Last update: 2010-01-23 00:31    [W:0.023 / U:16.424 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site