aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/isdn
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@web.de>2010-10-17 01:18:15 -0400
committerDavid S. Miller <davem@davemloft.net>2010-10-21 07:25:49 -0400
commitb003f4e171304234eae9cc11c9fd7f1cbaaf0d6b (patch)
treeeb8b14040370ec664c72d8c57fd617a9fe38618f /drivers/isdn
parent1e253c3b8a1aeed51eef6fc366812f219b97de65 (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/isdn')
-rw-r--r--drivers/isdn/capi/kcapi.c19
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
101static 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
101static inline struct capi20_appl *get_capi_appl_by_nr(u16 applid) 111static 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 }