From: Rusty Russell <rusty@rustcorp.com.au>
To: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: virtualization@lists.linux-foundation.org, kvm@vger.kernel.org
Subject: Re: virtio_net: another race with virtio_net and enable_cb
Date: Tue, 27 May 2008 12:36:00 +1000 [thread overview]
Message-ID: <200805271236.00439.rusty@rustcorp.com.au> (raw)
In-Reply-To: <200805261129.27718.borntraeger@de.ibm.com>
On Monday 26 May 2008 19:29:27 Christian Borntraeger wrote:
> Hello Rusty,
Hi Christian,
As always, you post an interesting bug!
> /* Out of packets? */
> if (received < budget) {
> netif_rx_complete(vi->dev, napi);
> if (unlikely(!vi->rvq->vq_ops->enable_cb(vi->rvq))
> && napi_schedule_prep(napi)) {
> vi->rvq->vq_ops->disable_cb(vi->rvq);
> __netif_rx_schedule(vi->dev, napi);
> goto again;
> }
> }
Yes, clearly if napi_schedule_prep() fails (ie. another poll is scheduled), we
don't disable callbacks, and another poll will be run with callbacks enabled,
triggering this bug. It can only happen if the enable_cb succeeds (no new
work) then a new packet arrives before napi_schedule_prep().
You should be able to verify that you are hitting this window by putting a
printk in the !enable_cb && !napi_schedule_prep case.
Now, we can't do an unconditional disable_cb(), as it won't prevent this race,
and would make it worse if it ran after the other poll's enable_cb() and left
us without a callback to wake us up. We could do a disable_cb() at the top
of virtnet_poll, but I certainly don't want to write the comment explaining
why.
So your fix is correct and sensible. Applied.
Thanks!
Rusty.
next prev parent reply other threads:[~2008-05-27 2:36 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-26 9:29 virtio_net: another race with virtio_net and enable_cb Christian Borntraeger
2008-05-27 2:36 ` Rusty Russell [this message]
2008-05-27 10:25 ` Christian Borntraeger
2008-05-27 10:25 ` Christian Borntraeger
2008-05-27 2:36 ` Rusty Russell
-- strict thread matches above, loose matches on Subject: below --
2008-05-26 9:29 Christian Borntraeger
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=200805271236.00439.rusty@rustcorp.com.au \
--to=rusty@rustcorp.com.au \
--cc=borntraeger@de.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=virtualization@lists.linux-foundation.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.