[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH net] xen-netback: add the scenario which now beyond the range time_after_eq().

On 2013-10-17 16:26, Jan Beulich wrote:
On 16.10.13 at 19:22, Jason Luan<jianhai.luan@xxxxxxxxxx>  wrote:
time_after_eq() only works if the delta is < MAX_ULONG/2.

If netfront sends 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 (e.g., if prior to the long gap, all
credit was exhausted).

We should add the scenario which now beyond next_credit+MAX_UNLONG/2. Because
the fact now must be not before than expire, time_before(now, expire) == true
will verify the scenario.
     time_after_eq(now, next_credit) || time_before (now, expire)
     !time_in_range_open(now, expire, next_credit)
So first of all this must be with a 32-bit netback. And the not
coverable gap between activity is well over 240 days long. _If_
this really needs dealing with, then why is extending this from
240+ to 480+ days sufficient?

I am not so sure your mean about extending from 240+ to 480+. Do you mean "now" wrapped case happens and falls into the range of from expires to next_credit? If this happens, the timer would be set with value based on next_credit, which is actually implements the rate control.

I.e. why don't you simply
change to 64-bit jiffy values, and use time_after_eq64()?


Signed-off-by: Jason Luan<jianhai.luan@xxxxxxxxxx>
  drivers/net/xen-netback/netback.c |    7 +++++--
  1 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/xen-netback/netback.c
index f3e591c..31eedaf 100644
--- a/drivers/net/xen-netback/netback.c
+++ b/drivers/net/xen-netback/netback.c
@@ -1194,8 +1194,11 @@ static bool tx_credit_exceeded(struct xenvif *vif,
unsigned size)
        if (timer_pending(&vif->credit_timeout))
                return true;
- /* Passed the point where we can replenish credit? */
-       if (time_after_eq(now, next_credit)) {
+       /* Credit should be replenished when now does not fall into the
+        * range from expires to next_credit, and time_in_range_open()
+        * is used to verify whether this case happens.
+        */
+       if (!time_in_range_open(now, vif->credit_timeout.expires, next_credit)) 
                vif->credit_timeout.expires = now;

Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel

Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.