CAPI: Silence lockdep warning on get_capi_appl_by_nr usage
authorJan Kiszka <jan.kiszka@web.de>
Sun, 17 Oct 2010 05:18:15 +0000 (05:18 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 21 Oct 2010 11:25:49 +0000 (04:25 -0700)
As long as we hold capi_controller_lock, we can safely access
capi_applications without RCU protection as no one can modify the
application list underneath us. Introduce an RCU-free
__get_capi_appl_by_nr for this purpose. This silences lockdep warnings
on suspicious rcu_dereference usage.

Signed-off-by: Jan Kiszka <jan.kiszka@web.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/isdn/capi/kcapi.c

index b054494df846958d99fdc45c4075dc57339981bd..3acf94cc5acda3f056db58b559a8af477f6ae76a 100644 (file)
@@ -98,6 +98,16 @@ static inline struct capi_ctr *get_capi_ctr_by_nr(u16 contr)
        return capi_controller[contr - 1];
 }
 
+static inline struct capi20_appl *__get_capi_appl_by_nr(u16 applid)
+{
+       lockdep_assert_held(&capi_controller_lock);
+
+       if (applid - 1 >= CAPI_MAXAPPL)
+               return NULL;
+
+       return capi_applications[applid - 1];
+}
+
 static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid)
 {
        if (applid - 1 >= CAPI_MAXAPPL)
@@ -185,10 +195,9 @@ static void notify_up(u32 contr)
                ctr->state = CAPI_CTR_RUNNING;
 
                for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
-                       ap = get_capi_appl_by_nr(applid);
-                       if (!ap)
-                               continue;
-                       register_appl(ctr, applid, &ap->rparam);
+                       ap = __get_capi_appl_by_nr(applid);
+                       if (ap)
+                               register_appl(ctr, applid, &ap->rparam);
                }
 
                wake_up_interruptible_all(&ctr->state_wait_queue);
@@ -215,7 +224,7 @@ static void ctr_down(struct capi_ctr *ctr, int new_state)
        memset(ctr->serial, 0, sizeof(ctr->serial));
 
        for (applid = 1; applid <= CAPI_MAXAPPL; applid++) {
-               ap = get_capi_appl_by_nr(applid);
+               ap = __get_capi_appl_by_nr(applid);
                if (ap)
                        capi_ctr_put(ctr);
        }