| From 33bd500c22d99c8213fe7fb2583188dc0c323184 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 11 Sep 2018 11:42:06 -0700 |
| Subject: llc: avoid blocking in llc_sap_close() |
| |
| From: Cong Wang <xiyou.wangcong@gmail.com> |
| |
| [ Upstream commit 9708d2b5b7c648e8e0a40d11e8cea12f6277f33c ] |
| |
| llc_sap_close() is called by llc_sap_put() which |
| could be called in BH context in llc_rcv(). We can't |
| block in BH. |
| |
| There is no reason to block it here, kfree_rcu() should |
| be sufficient. |
| |
| Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/net/llc.h | 1 + |
| net/llc/llc_core.c | 4 +--- |
| 2 files changed, 2 insertions(+), 3 deletions(-) |
| |
| diff --git a/include/net/llc.h b/include/net/llc.h |
| index 890a87318014d..df282d9b40170 100644 |
| --- a/include/net/llc.h |
| +++ b/include/net/llc.h |
| @@ -66,6 +66,7 @@ struct llc_sap { |
| int sk_count; |
| struct hlist_nulls_head sk_laddr_hash[LLC_SK_LADDR_HASH_ENTRIES]; |
| struct hlist_head sk_dev_hash[LLC_SK_DEV_HASH_ENTRIES]; |
| + struct rcu_head rcu; |
| }; |
| |
| static inline |
| diff --git a/net/llc/llc_core.c b/net/llc/llc_core.c |
| index 260b3dc1b4a2a..64d4bef04e730 100644 |
| --- a/net/llc/llc_core.c |
| +++ b/net/llc/llc_core.c |
| @@ -127,9 +127,7 @@ void llc_sap_close(struct llc_sap *sap) |
| list_del_rcu(&sap->node); |
| spin_unlock_bh(&llc_sap_list_lock); |
| |
| - synchronize_rcu(); |
| - |
| - kfree(sap); |
| + kfree_rcu(sap, rcu); |
| } |
| |
| static struct packet_type llc_packet_type __read_mostly = { |
| -- |
| 2.20.1 |
| |