From: jianhai luan <jianhai.luan@oracle.com>
To: David Vrabel <dvrabel@cantab.net>, Wei Liu <wei.liu2@citrix.com>,
xen-devel@lists.xen.org, netdev@vger.kernel.org
Cc: Ian Campbell <ian.campbell@citrix.com>,
annie.li@oracle.com, david.vrabel@citrix.com, jbeulich@suse.com
Subject: Re: [Xen-devel] [PATCH net] xen-netback: use jiffies_64 value to calculate credit timeout
Date: Mon, 28 Oct 2013 16:36:03 +0800 [thread overview]
Message-ID: <526E21F3.4060103@oracle.com> (raw)
In-Reply-To: <526E1E97.7090804@cantab.net>
On 2013-10-28 16:21, David Vrabel wrote:
> On 27/10/2013 11:11, Wei Liu wrote:
>> time_after_eq() only works if the delta is < MAX_ULONG/2.
>>
>> For a 32bit Dom0, if netfront sends packets at a very low rate, the time
>> between subsequent calls to tx_credit_exceeded() may exceed MAX_ULONG/2
>> and the test for timer_after_eq() will be incorrect. Credit will not be
>> replenished and the guest may become unable to send packets (e.g., if
>> prior to the long gap, all credit was exhausted).
>>
>> Use jiffies_64 variant to mitigate this problem for 32bit Dom0.
> Thanks.
>
>> Suggested-by: Jan Beulich <jbeulich@suse.com>
>> Suggested-by: David Vrabel <david.vrabel@citrix.com>
> Jan's suggestion; I just agreed with him.
>
>> Signed-off-by: Wei Liu <wei.liu2@citrix.com>
>> Cc: Ian Campbell <ian.campbell@citrix.com>
>> Cc: Jason Luan <jianhai.luan@oracle.com>
>> ---
>> drivers/net/xen-netback/common.h | 1 +
>> drivers/net/xen-netback/interface.c | 4 ++--
>> drivers/net/xen-netback/netback.c | 13 ++++++-------
>> 3 files changed, 9 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/net/xen-netback/common.h b/drivers/net/xen-netback/common.h
>> index 5715318..400fea1 100644
>> --- a/drivers/net/xen-netback/common.h
>> +++ b/drivers/net/xen-netback/common.h
>> @@ -163,6 +163,7 @@ struct xenvif {
>> unsigned long credit_usec;
>> unsigned long remaining_credit;
>> struct timer_list credit_timeout;
>> + u64 credit_window_start;
>>
>> /* Statistics */
>> unsigned long rx_gso_checksum_fixup;
>> diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
>> index 01bb854..8c45b63 100644
>> --- a/drivers/net/xen-netback/interface.c
>> +++ b/drivers/net/xen-netback/interface.c
>> @@ -312,8 +312,8 @@ struct xenvif *xenvif_alloc(struct device *parent, domid_t domid,
>> vif->credit_bytes = vif->remaining_credit = ~0UL;
>> vif->credit_usec = 0UL;
>> init_timer(&vif->credit_timeout);
>> - /* Initialize 'expires' now: it's used to track the credit window. */
>> - vif->credit_timeout.expires = jiffies;
>> + /* credit window is tracked in credit_window_start */
> You could drop this comment as the field name makes this obvious.
>
>> + vif->credit_window_start = get_jiffies_64();
>>
>> dev->netdev_ops = &xenvif_netdev_ops;
>> dev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
>> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c
>> index f3e591c..1bc0688 100644
>> --- a/drivers/net/xen-netback/netback.c
>> +++ b/drivers/net/xen-netback/netback.c
>> @@ -1185,18 +1185,17 @@ out:
>>
>> static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
>> {
>> - unsigned long now = jiffies;
>> - unsigned long next_credit =
>> - vif->credit_timeout.expires +
>> - msecs_to_jiffies(vif->credit_usec / 1000);
>> + u64 now = get_jiffies_64();
>> + u64 next_credit = vif->credit_window_start +
>> + (u64)msecs_to_jiffies(vif->credit_usec / 1000);
>>
>> /* Timer could already be pending in rare cases. */
>> if (timer_pending(&vif->credit_timeout))
>> return true;
>>
>> /* Passed the point where we can replenish credit? */
>> - if (time_after_eq(now, next_credit)) {
>> - vif->credit_timeout.expires = now;
>> + if (time_after_eq64(now, next_credit)) {
>> + vif->credit_timeout.expires = (unsigned long)now;
> Need to set vif->credit_window_start = now here instead of .expires.
I agree Annie's suggest. add the below line;
vif->credit_window_start = now
vif->credit_timeout.expires = (unsigned long)now;
>> tx_add_credit(vif);
>> }
>>
>> @@ -1207,7 +1206,7 @@ static bool tx_credit_exceeded(struct xenvif *vif, unsigned size)
>> vif->credit_timeout.function =
>> tx_credit_callback;
>> mod_timer(&vif->credit_timeout,
>> - next_credit);
>> + (unsigned long)next_credit);
> Need to set vif->credit_window_start = next_credit here as well.
I think that we shouldn't add the above line.
>
> David
Jason
next prev parent reply other threads:[~2013-10-28 8:37 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-27 11:11 [PATCH net] xen-netback: use jiffies_64 value to calculate credit timeout Wei Liu
2013-10-28 2:36 ` annie li
2013-10-28 2:58 ` annie li
2013-10-28 2:58 ` [Xen-devel] " annie li
2013-10-28 6:28 ` jianhai luan
2013-10-28 6:28 ` [Xen-devel] " jianhai luan
2013-10-28 11:30 ` Wei Liu
2013-10-28 11:30 ` Wei Liu
2013-10-28 2:36 ` annie li
2013-10-28 8:21 ` David Vrabel
2013-10-28 8:36 ` jianhai luan [this message]
2013-10-28 8:36 ` jianhai luan
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=526E21F3.4060103@oracle.com \
--to=jianhai.luan@oracle.com \
--cc=annie.li@oracle.com \
--cc=david.vrabel@citrix.com \
--cc=dvrabel@cantab.net \
--cc=ian.campbell@citrix.com \
--cc=jbeulich@suse.com \
--cc=netdev@vger.kernel.org \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xen.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.