diff options
author | Jan Kiszka <jan.kiszka@web.de> | 2010-10-17 01:18:15 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-21 07:25:49 -0400 |
commit | b003f4e171304234eae9cc11c9fd7f1cbaaf0d6b (patch) | |
tree | eb8b14040370ec664c72d8c57fd617a9fe38618f /drivers | |
parent | 1e253c3b8a1aeed51eef6fc366812f219b97de65 (diff) |
CAPI: Silence lockdep warning on get_capi_appl_by_nr usage
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/isdn/capi/kcapi.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index b054494df846..3acf94cc5acd 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c | |||
@@ -98,6 +98,16 @@ static inline struct capi_ctr *get_capi_ctr_by_nr(u16 contr) | |||
98 | return capi_controller[contr - 1]; | 98 | return capi_controller[contr - 1]; |
99 | } | 99 | } |
100 | 100 | ||
101 | static inline struct capi20_appl *__get_capi_appl_by_nr(u16 applid) | ||
102 | { | ||
103 | lockdep_assert_held(&capi_controller_lock); | ||
104 | |||
105 | if (applid - 1 >= CAPI_MAXAPPL) | ||
106 | return NULL; | ||
107 | |||
108 | return capi_applications[applid - 1]; | ||
109 | } | ||
110 | |||
101 | static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid) | 111 | static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid) |
102 | { | 112 | { |
103 | if (applid - 1 >= CAPI_MAXAPPL) | 113 | if (applid - 1 >= CAPI_MAXAPPL) |
@@ -185,10 +195,9 @@ static void notify_up(u32 contr) | |||
185 | ctr->state = CAPI_CTR_RUNNING; | 195 | ctr->state = CAPI_CTR_RUNNING; |
186 | 196 | ||
187 | for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { | 197 | for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { |
188 | ap = get_capi_appl_by_nr(applid); | 198 | ap = __get_capi_appl_by_nr(applid); |
189 | if (!ap) | 199 | if (ap) |
190 | continue; | 200 | register_appl(ctr, applid, &ap->rparam); |
191 | register_appl(ctr, applid, &ap->rparam); | ||
192 | } | 201 | } |
193 | 202 | ||
194 | wake_up_interruptible_all(&ctr->state_wait_queue); | 203 | wake_up_interruptible_all(&ctr->state_wait_queue); |
@@ -215,7 +224,7 @@ static void ctr_down(struct capi_ctr *ctr, int new_state) | |||
215 | memset(ctr->serial, 0, sizeof(ctr->serial)); | 224 | memset(ctr->serial, 0, sizeof(ctr->serial)); |
216 | 225 | ||
217 | for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { | 226 | for (applid = 1; applid <= CAPI_MAXAPPL; applid++) { |
218 | ap = get_capi_appl_by_nr(applid); | 227 | ap = __get_capi_appl_by_nr(applid); |
219 | if (ap) | 228 | if (ap) |
220 | capi_ctr_put(ctr); | 229 | capi_ctr_put(ctr); |
221 | } | 230 | } |