@@ -110,7 +110,7 @@ struct ffa_drv_info {
110
110
struct work_struct sched_recv_irq_work ;
111
111
struct xarray partition_info ;
112
112
DECLARE_HASHTABLE (notifier_hash , ilog2 (FFA_MAX_NOTIFICATIONS ));
113
- struct mutex notify_lock ; /* lock to protect notifier hashtable */
113
+ rwlock_t notify_lock ; /* lock to protect notifier hashtable */
114
114
};
115
115
116
116
static struct ffa_drv_info * drv_info ;
@@ -1289,19 +1289,19 @@ static int __ffa_notify_relinquish(struct ffa_device *dev, int notify_id,
1289
1289
if (notify_id >= FFA_MAX_NOTIFICATIONS )
1290
1290
return - EINVAL ;
1291
1291
1292
- mutex_lock (& drv_info -> notify_lock );
1292
+ write_lock (& drv_info -> notify_lock );
1293
1293
1294
1294
rc = update_notifier_cb (dev , notify_id , NULL , is_framework );
1295
1295
if (rc ) {
1296
1296
pr_err ("Could not unregister notification callback\n" );
1297
- mutex_unlock (& drv_info -> notify_lock );
1297
+ write_unlock (& drv_info -> notify_lock );
1298
1298
return rc ;
1299
1299
}
1300
1300
1301
1301
if (!is_framework )
1302
1302
rc = ffa_notification_unbind (dev -> vm_id , BIT (notify_id ));
1303
1303
1304
- mutex_unlock (& drv_info -> notify_lock );
1304
+ write_unlock (& drv_info -> notify_lock );
1305
1305
1306
1306
return rc ;
1307
1307
}
@@ -1341,7 +1341,7 @@ static int __ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu,
1341
1341
else
1342
1342
cb_info -> cb = cb ;
1343
1343
1344
- mutex_lock (& drv_info -> notify_lock );
1344
+ write_lock (& drv_info -> notify_lock );
1345
1345
1346
1346
if (!is_framework ) {
1347
1347
if (is_per_vcpu )
@@ -1361,7 +1361,7 @@ static int __ffa_notify_request(struct ffa_device *dev, bool is_per_vcpu,
1361
1361
}
1362
1362
1363
1363
out_unlock_free :
1364
- mutex_unlock (& drv_info -> notify_lock );
1364
+ write_unlock (& drv_info -> notify_lock );
1365
1365
if (rc )
1366
1366
kfree (cb_info );
1367
1367
@@ -1407,9 +1407,9 @@ static void handle_notif_callbacks(u64 bitmap, enum notify_type type)
1407
1407
if (!(bitmap & 1 ))
1408
1408
continue ;
1409
1409
1410
- mutex_lock (& drv_info -> notify_lock );
1410
+ read_lock (& drv_info -> notify_lock );
1411
1411
cb_info = notifier_hnode_get_by_type (notify_id , type );
1412
- mutex_unlock (& drv_info -> notify_lock );
1412
+ read_unlock (& drv_info -> notify_lock );
1413
1413
1414
1414
if (cb_info && cb_info -> cb )
1415
1415
cb_info -> cb (notify_id , cb_info -> cb_data );
@@ -1447,9 +1447,9 @@ static void handle_fwk_notif_callbacks(u32 bitmap)
1447
1447
1448
1448
ffa_rx_release ();
1449
1449
1450
- mutex_lock (& drv_info -> notify_lock );
1450
+ read_lock (& drv_info -> notify_lock );
1451
1451
cb_info = notifier_hnode_get_by_vmid_uuid (notify_id , target , & uuid );
1452
- mutex_unlock (& drv_info -> notify_lock );
1452
+ read_unlock (& drv_info -> notify_lock );
1453
1453
1454
1454
if (cb_info && cb_info -> fwk_cb )
1455
1455
cb_info -> fwk_cb (notify_id , cb_info -> cb_data , buf );
@@ -1974,7 +1974,7 @@ static void ffa_notifications_setup(void)
1974
1974
goto cleanup ;
1975
1975
1976
1976
hash_init (drv_info -> notifier_hash );
1977
- mutex_init (& drv_info -> notify_lock );
1977
+ rwlock_init (& drv_info -> notify_lock );
1978
1978
1979
1979
drv_info -> notif_enabled = true;
1980
1980
return ;
0 commit comments