crypto: deadlock between crypto_alg_sem/rtnl_mutex/genl_mutex
On Tue, Mar 14, 2017 at 10:44:10AM +0100, Dmitry Vyukov wrote: > > Yes, please. > Disregarding some reports is not a good way long term. Please try this patch. ---8<--- Subject: netlink: Annotate nlk cb_mutex by protocol Currently all occurences of nlk->cb_mutex are annotated by lockdep as a single class. This causes a false lcokdep cycle involving genl and crypto_user. This patch fixes it by dividing cb_mutex into individual classes based on the netlink protocol. As genl and crypto_user do not use the same netlink protocol this breaks the false dependency loop. Reported-by: Dmitry Vyukov <dvyukov@google.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
98d068ab52
commit
8a0f5ccfb3
|
@ -96,6 +96,44 @@ EXPORT_SYMBOL_GPL(nl_table);
|
||||||
|
|
||||||
static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait);
|
static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait);
|
||||||
|
|
||||||
|
static struct lock_class_key nlk_cb_mutex_keys[MAX_LINKS];
|
||||||
|
|
||||||
|
static const char *const nlk_cb_mutex_key_strings[MAX_LINKS + 1] = {
|
||||||
|
"nlk_cb_mutex-ROUTE",
|
||||||
|
"nlk_cb_mutex-1",
|
||||||
|
"nlk_cb_mutex-USERSOCK",
|
||||||
|
"nlk_cb_mutex-FIREWALL",
|
||||||
|
"nlk_cb_mutex-SOCK_DIAG",
|
||||||
|
"nlk_cb_mutex-NFLOG",
|
||||||
|
"nlk_cb_mutex-XFRM",
|
||||||
|
"nlk_cb_mutex-SELINUX",
|
||||||
|
"nlk_cb_mutex-ISCSI",
|
||||||
|
"nlk_cb_mutex-AUDIT",
|
||||||
|
"nlk_cb_mutex-FIB_LOOKUP",
|
||||||
|
"nlk_cb_mutex-CONNECTOR",
|
||||||
|
"nlk_cb_mutex-NETFILTER",
|
||||||
|
"nlk_cb_mutex-IP6_FW",
|
||||||
|
"nlk_cb_mutex-DNRTMSG",
|
||||||
|
"nlk_cb_mutex-KOBJECT_UEVENT",
|
||||||
|
"nlk_cb_mutex-GENERIC",
|
||||||
|
"nlk_cb_mutex-17",
|
||||||
|
"nlk_cb_mutex-SCSITRANSPORT",
|
||||||
|
"nlk_cb_mutex-ECRYPTFS",
|
||||||
|
"nlk_cb_mutex-RDMA",
|
||||||
|
"nlk_cb_mutex-CRYPTO",
|
||||||
|
"nlk_cb_mutex-SMC",
|
||||||
|
"nlk_cb_mutex-23",
|
||||||
|
"nlk_cb_mutex-24",
|
||||||
|
"nlk_cb_mutex-25",
|
||||||
|
"nlk_cb_mutex-26",
|
||||||
|
"nlk_cb_mutex-27",
|
||||||
|
"nlk_cb_mutex-28",
|
||||||
|
"nlk_cb_mutex-29",
|
||||||
|
"nlk_cb_mutex-30",
|
||||||
|
"nlk_cb_mutex-31",
|
||||||
|
"nlk_cb_mutex-MAX_LINKS"
|
||||||
|
};
|
||||||
|
|
||||||
static int netlink_dump(struct sock *sk);
|
static int netlink_dump(struct sock *sk);
|
||||||
static void netlink_skb_destructor(struct sk_buff *skb);
|
static void netlink_skb_destructor(struct sk_buff *skb);
|
||||||
|
|
||||||
|
@ -585,6 +623,9 @@ static int __netlink_create(struct net *net, struct socket *sock,
|
||||||
} else {
|
} else {
|
||||||
nlk->cb_mutex = &nlk->cb_def_mutex;
|
nlk->cb_mutex = &nlk->cb_def_mutex;
|
||||||
mutex_init(nlk->cb_mutex);
|
mutex_init(nlk->cb_mutex);
|
||||||
|
lockdep_set_class_and_name(nlk->cb_mutex,
|
||||||
|
nlk_cb_mutex_keys + protocol,
|
||||||
|
nlk_cb_mutex_key_strings[protocol]);
|
||||||
}
|
}
|
||||||
init_waitqueue_head(&nlk->wait);
|
init_waitqueue_head(&nlk->wait);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue