* [PATCH] rionet: Fix refcounting bugs
@ 2023-03-28 4:50 Liang He
2023-03-29 2:10 ` Jakub Kicinski
0 siblings, 1 reply; 5+ messages in thread
From: Liang He @ 2023-03-28 4:50 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, windhl, netdev
In rionet_start_xmit(), we should put the refcount_inc()
before we add *skb* into the queue, otherwise it may cause
the consumer to prematurely call refcount_dec().
Besides, before the next rionet_queue_tx_msg() when we
meet the 'RIONET_MAC_MATCH', we should also call
refcount_inc() before the skb is added into the queue.
Fixes: 7c4a6106d645 ("rapidio/rionet: fix multicast packet transmit logic")
Signed-off-by: Liang He <windhl@126.com>
---
drivers/net/rionet.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/drivers/net/rionet.c b/drivers/net/rionet.c
index fbcb9d05da64..72ccbb1aaf11 100644
--- a/drivers/net/rionet.c
+++ b/drivers/net/rionet.c
@@ -195,17 +195,19 @@ static netdev_tx_t rionet_start_xmit(struct sk_buff *skb,
for (i = 0; i < RIO_MAX_ROUTE_ENTRIES(rnet->mport->sys_size);
i++)
if (nets[rnet->mport->id].active[i]) {
- rionet_queue_tx_msg(skb, ndev,
- nets[rnet->mport->id].active[i]);
if (count)
refcount_inc(&skb->users);
count++;
+ rionet_queue_tx_msg(skb, ndev,
+ nets[rnet->mport->id].active[i]);
}
} else if (RIONET_MAC_MATCH(eth->h_dest)) {
destid = RIONET_GET_DESTID(eth->h_dest);
- if (nets[rnet->mport->id].active[destid])
+ if (nets[rnet->mport->id].active[destid]) {
+ refcount_inc(&skb->users);
rionet_queue_tx_msg(skb, ndev,
nets[rnet->mport->id].active[destid]);
+ }
else {
/*
* If the target device was removed from the list of
--
2.25.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] rionet: Fix refcounting bugs
2023-03-28 4:50 [PATCH] rionet: Fix refcounting bugs Liang He
@ 2023-03-29 2:10 ` Jakub Kicinski
2023-03-29 6:01 ` Liang He
0 siblings, 1 reply; 5+ messages in thread
From: Jakub Kicinski @ 2023-03-29 2:10 UTC (permalink / raw)
To: Liang He; +Cc: davem, edumazet, pabeni, netdev
On Tue, 28 Mar 2023 12:50:06 +0800 Liang He wrote:
> In rionet_start_xmit(), we should put the refcount_inc()
> before we add *skb* into the queue, otherwise it may cause
> the consumer to prematurely call refcount_dec().
Are you sure the race can happen? Look around the code, please.
> Besides, before the next rionet_queue_tx_msg() when we
> meet the 'RIONET_MAC_MATCH', we should also call
> refcount_inc() before the skb is added into the queue.
And why is that?
As far as I can tell your patch reorders something that doesn't matter
and then adds a bug :|
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re:Re: [PATCH] rionet: Fix refcounting bugs
2023-03-29 2:10 ` Jakub Kicinski
@ 2023-03-29 6:01 ` Liang He
2023-03-29 18:09 ` Simon Horman
0 siblings, 1 reply; 5+ messages in thread
From: Liang He @ 2023-03-29 6:01 UTC (permalink / raw)
To: Jakub Kicinski; +Cc: davem, edumazet, pabeni, netdev
Hi, Jakub,
First, thanks for you reviewing our patch again.
At 2023-03-29 10:10:51, "Jakub Kicinski" <kuba@kernel.org> wrote:
>On Tue, 28 Mar 2023 12:50:06 +0800 Liang He wrote:
>> In rionet_start_xmit(), we should put the refcount_inc()
>> before we add *skb* into the queue, otherwise it may cause
>> the consumer to prematurely call refcount_dec().
>
>Are you sure the race can happen? Look around the code, please.
We commit this patch based on the pattern we learned from these commits,
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=bb765d1c331f62b59049d35607ed2e365802bef9
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=47a017f33943278570c072bc71681809b2567b3a
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=b780d7415aacec855e2f2370cbf98f918b224903
If it is indeed in different context which makes our pattern failed, please kindly pointing out it.
>
>> Besides, before the next rionet_queue_tx_msg() when we
>> meet the 'RIONET_MAC_MATCH', we should also call
>> refcount_inc() before the skb is added into the queue.
>
>And why is that?
We think it should be better to keep the consistent refcounting-operation
when we put the *skb* into the queue.
>
>As far as I can tell your patch reorders something that doesn't matter
>and then adds a bug :|
If there is any bug, can you kindly tell us?
Thanks,
Liang
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] rionet: Fix refcounting bugs
2023-03-29 6:01 ` Liang He
@ 2023-03-29 18:09 ` Simon Horman
2023-03-30 2:09 ` Liang He
0 siblings, 1 reply; 5+ messages in thread
From: Simon Horman @ 2023-03-29 18:09 UTC (permalink / raw)
To: Liang He; +Cc: Jakub Kicinski, davem, edumazet, pabeni, netdev
On Wed, Mar 29, 2023 at 02:01:30PM +0800, Liang He wrote:
>
> Hi, Jakub,
>
> First, thanks for you reviewing our patch again.
>
> At 2023-03-29 10:10:51, "Jakub Kicinski" <kuba@kernel.org> wrote:
> >On Tue, 28 Mar 2023 12:50:06 +0800 Liang He wrote:
> >> In rionet_start_xmit(), we should put the refcount_inc()
> >> before we add *skb* into the queue, otherwise it may cause
> >> the consumer to prematurely call refcount_dec().
> >
> >Are you sure the race can happen? Look around the code, please.
>
> We commit this patch based on the pattern we learned from these commits,
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=bb765d1c331f62b59049d35607ed2e365802bef9
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=47a017f33943278570c072bc71681809b2567b3a
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=b780d7415aacec855e2f2370cbf98f918b224903
>
> If it is indeed in different context which makes our pattern failed, please kindly pointing out it.
The difference is that these are not start_xmit callbacks.
See below.
> >> Besides, before the next rionet_queue_tx_msg() when we
> >> meet the 'RIONET_MAC_MATCH', we should also call
> >> refcount_inc() before the skb is added into the queue.
> >
> >And why is that?
>
> We think it should be better to keep the consistent refcounting-operation
> when we put the *skb* into the queue.
It's subjective.
Due to the locking of the code in question there is no race.
The code you modify is protected by &rnet->tx_lock.
As is the code that will decrement (and free) the skb.
> >As far as I can tell your patch reorders something that doesn't matter
> >and then adds a bug :|
>
> If there is any bug, can you kindly tell us?
We are dealing with a start_xmit NDO callback.
To simplify things, let us only consider cases where
NETDEV_TX_OK is returned, which is the case for the code you modify.
In such cases the callback should consume the skb, which already
has a reference taken on it. This is done in the driver by a call
to dev_kfree_skb_irq() which is executed indirectly via
rionet_queue_tx_msg().
So currently the reference count handling is correct.
By taking an extra reference, it will never reach zero,
and thus the resources of the skb will be leaked.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re:Re: [PATCH] rionet: Fix refcounting bugs
2023-03-29 18:09 ` Simon Horman
@ 2023-03-30 2:09 ` Liang He
0 siblings, 0 replies; 5+ messages in thread
From: Liang He @ 2023-03-30 2:09 UTC (permalink / raw)
To: Simon Horman; +Cc: Jakub Kicinski, davem, edumazet, pabeni, netdev
At 2023-03-30 02:09:42, "Simon Horman" <simon.horman@corigine.com> wrote:
>On Wed, Mar 29, 2023 at 02:01:30PM +0800, Liang He wrote:
>>
>> Hi, Jakub,
>>
>> First, thanks for you reviewing our patch again.
>>
>> At 2023-03-29 10:10:51, "Jakub Kicinski" <kuba@kernel.org> wrote:
>> >On Tue, 28 Mar 2023 12:50:06 +0800 Liang He wrote:
>> >> In rionet_start_xmit(), we should put the refcount_inc()
>> >> before we add *skb* into the queue, otherwise it may cause
>> >> the consumer to prematurely call refcount_dec().
>> >
>> >Are you sure the race can happen? Look around the code, please.
>>
>> We commit this patch based on the pattern we learned from these commits,
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=bb765d1c331f62b59049d35607ed2e365802bef9
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=47a017f33943278570c072bc71681809b2567b3a
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?h=v6.3-rc4&id=b780d7415aacec855e2f2370cbf98f918b224903
>>
>> If it is indeed in different context which makes our pattern failed, please kindly pointing out it.
>
>The difference is that these are not start_xmit callbacks.
>See below.
>
>> >> Besides, before the next rionet_queue_tx_msg() when we
>> >> meet the 'RIONET_MAC_MATCH', we should also call
>> >> refcount_inc() before the skb is added into the queue.
>> >
>> >And why is that?
>>
>> We think it should be better to keep the consistent refcounting-operation
>> when we put the *skb* into the queue.
>
>It's subjective.
>Due to the locking of the code in question there is no race.
>The code you modify is protected by &rnet->tx_lock.
Thanks for your reply, we get it.
>As is the code that will decrement (and free) the skb.
>
>> >As far as I can tell your patch reorders something that doesn't matter
>> >and then adds a bug :|
>>
>> If there is any bug, can you kindly tell us?
>
>We are dealing with a start_xmit NDO callback.
>To simplify things, let us only consider cases where
>NETDEV_TX_OK is returned, which is the case for the code you modify.
>In such cases the callback should consume the skb, which already
>has a reference taken on it. This is done in the driver by a call
>to dev_kfree_skb_irq() which is executed indirectly via
>rionet_queue_tx_msg().
>
>So currently the reference count handling is correct.
>By taking an extra reference, it will never reach zero,
>and thus the resources of the skb will be leaked.
Sorry for our trouble.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2023-03-30 2:13 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-03-28 4:50 [PATCH] rionet: Fix refcounting bugs Liang He
2023-03-29 2:10 ` Jakub Kicinski
2023-03-29 6:01 ` Liang He
2023-03-29 18:09 ` Simon Horman
2023-03-30 2:09 ` Liang He
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).