From: Taehee Yoo <ap420073@gmail.com>
To: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
edumazet@google.com, yoshfuji@linux-ipv6.org, dsahern@kernel.org,
netdev@vger.kernel.org
Cc: ap420073@gmail.com
Subject: [PATCH net] net: mld: do not use system_wq in the mld
Date: Thu, 21 Jul 2022 12:03:16 +0000 [thread overview]
Message-ID: <20220721120316.17070-1-ap420073@gmail.com> (raw)
mld works are supposed to be executed in mld_wq.
But mld_{query | report}_work() calls schedule_delayed_work().
schedule_delayed_work() internally uses system_wq.
So, this would cause the reference count leak.
splat looks like:
unregister_netdevice: waiting for br1 to become free. Usage count = 2
leaked reference.
ipv6_add_dev+0x3a5/0x1070
addrconf_notify+0x4f3/0x1760
notifier_call_chain+0x9e/0x180
register_netdevice+0xd10/0x11e0
br_dev_newlink+0x27/0x100 [bridge]
__rtnl_newlink+0xd85/0x14e0
rtnl_newlink+0x5f/0x90
rtnetlink_rcv_msg+0x335/0x9a0
netlink_rcv_skb+0x121/0x350
netlink_unicast+0x439/0x710
netlink_sendmsg+0x75f/0xc00
____sys_sendmsg+0x694/0x860
___sys_sendmsg+0xe9/0x160
__sys_sendmsg+0xbe/0x150
do_syscall_64+0x3b/0x90
entry_SYSCALL_64_after_hwframe+0x63/0xcd
Fixes: f185de28d9ae ("mld: add new workqueues for process mld events")
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
---
net/ipv6/mcast.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c
index 7f695c39d9a8..87c699d57b36 100644
--- a/net/ipv6/mcast.c
+++ b/net/ipv6/mcast.c
@@ -1522,7 +1522,6 @@ static void mld_query_work(struct work_struct *work)
if (++cnt >= MLD_MAX_QUEUE) {
rework = true;
- schedule_delayed_work(&idev->mc_query_work, 0);
break;
}
}
@@ -1533,8 +1532,10 @@ static void mld_query_work(struct work_struct *work)
__mld_query_work(skb);
mutex_unlock(&idev->mc_lock);
- if (!rework)
- in6_dev_put(idev);
+ if (rework && queue_delayed_work(mld_wq, &idev->mc_query_work, 0))
+ return;
+
+ in6_dev_put(idev);
}
/* called with rcu_read_lock() */
@@ -1624,7 +1625,6 @@ static void mld_report_work(struct work_struct *work)
if (++cnt >= MLD_MAX_QUEUE) {
rework = true;
- schedule_delayed_work(&idev->mc_report_work, 0);
break;
}
}
@@ -1635,8 +1635,10 @@ static void mld_report_work(struct work_struct *work)
__mld_report_work(skb);
mutex_unlock(&idev->mc_lock);
- if (!rework)
- in6_dev_put(idev);
+ if (rework && queue_delayed_work(mld_wq, &idev->mc_report_work, 0))
+ return;
+
+ in6_dev_put(idev);
}
static bool is_in(struct ifmcaddr6 *pmc, struct ip6_sf_list *psf, int type,
--
2.17.1
next reply other threads:[~2022-07-21 12:03 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-21 12:03 Taehee Yoo [this message]
2022-07-21 14:04 ` [PATCH net] net: mld: do not use system_wq in the mld Eric Dumazet
2022-07-21 17:53 ` Taehee Yoo
2022-07-21 18:34 ` Eric Dumazet
2022-07-21 19:01 ` Taehee Yoo
2022-07-22 2:35 ` Hangbin Liu
2022-07-22 4:23 ` Hangbin Liu
2022-07-22 4:50 ` Taehee Yoo
2022-07-22 6:16 ` Hangbin Liu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220721120316.17070-1-ap420073@gmail.com \
--to=ap420073@gmail.com \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=yoshfuji@linux-ipv6.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.