OSDN Git Service

Bluetooth: Fix Suspicious RCU usage warnings
authorMadhuparna Bhowmik <madhuparnabhowmik10@gmail.com>
Tue, 25 Feb 2020 13:08:09 +0000 (18:38 +0530)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 28 Feb 2020 07:35:28 +0000 (08:35 +0100)
The following functions in hci_core are always called with
hdev->lock held. No need to use list_for_each_entry_rcu(), therefore
change the usage of list_for_each_entry_rcu() in these functions
to list_for_each_entry().

hci_link_keys_clear()
hci_smp_ltks_clear()
hci_smp_irks_clear()
hci_blocked_keys_clear()

Warning encountered with CONFIG_PROVE_RCU_LIST:

[   72.213184] =============================
[   72.213188] WARNING: suspicious RCU usage
[   72.213192] 5.6.0-rc1+ #5 Not tainted
[   72.213195] -----------------------------
[   72.213198] net/bluetooth/hci_core.c:2288 RCU-list traversed in non-reader section!!

[   72.213676] =============================
[   72.213679] WARNING: suspicious RCU usage
[   72.213683] 5.6.0-rc1+ #5 Not tainted
[   72.213685] -----------------------------
[   72.213689] net/bluetooth/hci_core.c:2298 RCU-list traversed in non-reader section!!

[   72.214195] =============================
[   72.214198] WARNING: suspicious RCU usage
[   72.214201] 5.6.0-rc1+ #5 Not tainted
[   72.214204] -----------------------------
[   72.214208] net/bluetooth/hci_core.c:2308 RCU-list traversed in non-reader section!!

[  333.456972] =============================
[  333.456979] WARNING: suspicious RCU usage
[  333.457001] 5.6.0-rc1+ #5 Not tainted
[  333.457007] -----------------------------
[  333.457014] net/bluetooth/hci_core.c:2318 RCU-list traversed in non-reader section!!

Signed-off-by: Madhuparna Bhowmik <madhuparnabhowmik10@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
net/bluetooth/hci_core.c

index cbbc34a..8ddd1be 100644 (file)
@@ -2285,7 +2285,7 @@ void hci_link_keys_clear(struct hci_dev *hdev)
 {
        struct link_key *key;
 
-       list_for_each_entry_rcu(key, &hdev->link_keys, list) {
+       list_for_each_entry(key, &hdev->link_keys, list) {
                list_del_rcu(&key->list);
                kfree_rcu(key, rcu);
        }
@@ -2295,7 +2295,7 @@ void hci_smp_ltks_clear(struct hci_dev *hdev)
 {
        struct smp_ltk *k;
 
-       list_for_each_entry_rcu(k, &hdev->long_term_keys, list) {
+       list_for_each_entry(k, &hdev->long_term_keys, list) {
                list_del_rcu(&k->list);
                kfree_rcu(k, rcu);
        }
@@ -2305,7 +2305,7 @@ void hci_smp_irks_clear(struct hci_dev *hdev)
 {
        struct smp_irk *k;
 
-       list_for_each_entry_rcu(k, &hdev->identity_resolving_keys, list) {
+       list_for_each_entry(k, &hdev->identity_resolving_keys, list) {
                list_del_rcu(&k->list);
                kfree_rcu(k, rcu);
        }
@@ -2315,7 +2315,7 @@ void hci_blocked_keys_clear(struct hci_dev *hdev)
 {
        struct blocked_key *b;
 
-       list_for_each_entry_rcu(b, &hdev->blocked_keys, list) {
+       list_for_each_entry(b, &hdev->blocked_keys, list) {
                list_del_rcu(&b->list);
                kfree_rcu(b, rcu);
        }