CAPI: Rework application locking
Drop the application rw-lock in favour of RCU. This synchronizes capi20_release against capi_ctr_handle_message which may dereference an application from (soft-)IRQ context. Any other access to the application list is now protected by the capi_controller_lock as well. This also allows to safely inspect applications for /proc dumping by holding capi_controller_lock. At this chance, drop some useless release_in_progress checks where we obtained the application pointer from the list (which becomes NULL on release_in_progress). Signed-off-by: Jan Kiszka <jan.kiszka@web.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
0ca3a017a7
commit
88c896ef87
@@ -139,9 +139,11 @@ static const struct file_operations proc_contrstats_ops = {
|
||||
// applid nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
static void *
|
||||
applications_start(struct seq_file *seq, loff_t *pos)
|
||||
static void *applications_start(struct seq_file *seq, loff_t *pos)
|
||||
__acquires(capi_controller_lock)
|
||||
{
|
||||
mutex_lock(&capi_controller_lock);
|
||||
|
||||
if (*pos < CAPI_MAXAPPL)
|
||||
return &capi_applications[*pos];
|
||||
|
||||
@@ -158,9 +160,10 @@ applications_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
applications_stop(struct seq_file *seq, void *v)
|
||||
static void applications_stop(struct seq_file *seq, void *v)
|
||||
__releases(capi_controller_lock)
|
||||
{
|
||||
mutex_unlock(&capi_controller_lock);
|
||||
}
|
||||
|
||||
static int
|
||||
|
Reference in New Issue
Block a user