diff mbox

[v2,01/10] xen: credit1: return the 'time remaining to the limit' as next timeslice.

Message ID 147520400560.22544.6704334115981723287.stgit@Solace.fritz.box (mailing list archive)
State New, archived
Headers show

Commit Message

Dario Faggioli Sept. 30, 2016, 2:53 a.m. UTC
If vcpu x has run for 200us, and sched_ratelimit_us is
1000us, continue running x _but_ return 1000us-200us as
the next time slice. This way, next scheduling point will
happen in 800us, i.e., exactly at the point when x crosses
the threshold, and can be descheduled (if appropriate).

Right now (without this patch), we're always returning
sched_ratelimit_us (1000us, in the example above), which
means we're (potentially) allowing x to run more than
it should have been able to.

Note that, however, in order to avoid setting timers to very
short intervals, which is part of the purpose of rate limiting,
we never use a time slice smaller than a well defined threshold.
Such threshold (CSCHED_MIN_TIMER defined in this patch) is, in
general independent from rate limiting, but it looks a good idea
to set it to the minimum possible ratelimiting value.

Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>
---
Cc: George Dunlap <george.dunlap@eu.citrix.com>
---
Changes from v1:
 * introduce CSCHED_MIN_TIMER, as agreed during review.
---
 xen/common/sched_credit.c |   12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

Comments

George Dunlap Sept. 30, 2016, 11:16 a.m. UTC | #1
On 30/09/16 03:53, Dario Faggioli wrote:
> If vcpu x has run for 200us, and sched_ratelimit_us is
> 1000us, continue running x _but_ return 1000us-200us as
> the next time slice. This way, next scheduling point will
> happen in 800us, i.e., exactly at the point when x crosses
> the threshold, and can be descheduled (if appropriate).
> 
> Right now (without this patch), we're always returning
> sched_ratelimit_us (1000us, in the example above), which
> means we're (potentially) allowing x to run more than
> it should have been able to.
> 
> Note that, however, in order to avoid setting timers to very
> short intervals, which is part of the purpose of rate limiting,
> we never use a time slice smaller than a well defined threshold.
> Such threshold (CSCHED_MIN_TIMER defined in this patch) is, in
> general independent from rate limiting, but it looks a good idea
> to set it to the minimum possible ratelimiting value.
> 
> Signed-off-by: Dario Faggioli <dario.faggioli@citrix.com>

Reviewed-by: George Dunlap <george.dunlap@citrix.com>

> ---
> Cc: George Dunlap <george.dunlap@eu.citrix.com>
> ---
> Changes from v1:
>  * introduce CSCHED_MIN_TIMER, as agreed during review.
> ---
>  xen/common/sched_credit.c |   12 +++++++++++-
>  1 file changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c
> index b63efac..4d84b5f 100644
> --- a/xen/common/sched_credit.c
> +++ b/xen/common/sched_credit.c
> @@ -51,6 +51,8 @@
>  /* Default timeslice: 30ms */
>  #define CSCHED_DEFAULT_TSLICE_MS    30
>  #define CSCHED_CREDITS_PER_MSEC     10
> +/* Never set a timer shorter than this value. */
> +#define CSCHED_MIN_TIMER            XEN_SYSCTL_SCHED_RATELIMIT_MIN
>  
>  
>  /*
> @@ -1811,7 +1813,15 @@ csched_schedule(
>          snext = scurr;
>          snext->start_time += now;
>          perfc_incr(delay_ms);
> -        tslice = MICROSECS(prv->ratelimit_us);
> +        /*
> +         * Next timeslice must last just until we'll have executed for
> +         * ratelimit_us. However, to avoid setting a really short timer, which
> +         * will most likely be inaccurate and counterproductive, we never go
> +         * below CSCHED_MIN_TIMER.
> +         */
> +        tslice = MICROSECS(prv->ratelimit_us) - runtime;
> +        if ( unlikely(runtime < CSCHED_MIN_TIMER) )
> +            tslice = CSCHED_MIN_TIMER;
>          ret.migrated = 0;
>          goto out;
>      }
>
diff mbox

Patch

diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c
index b63efac..4d84b5f 100644
--- a/xen/common/sched_credit.c
+++ b/xen/common/sched_credit.c
@@ -51,6 +51,8 @@ 
 /* Default timeslice: 30ms */
 #define CSCHED_DEFAULT_TSLICE_MS    30
 #define CSCHED_CREDITS_PER_MSEC     10
+/* Never set a timer shorter than this value. */
+#define CSCHED_MIN_TIMER            XEN_SYSCTL_SCHED_RATELIMIT_MIN
 
 
 /*
@@ -1811,7 +1813,15 @@  csched_schedule(
         snext = scurr;
         snext->start_time += now;
         perfc_incr(delay_ms);
-        tslice = MICROSECS(prv->ratelimit_us);
+        /*
+         * Next timeslice must last just until we'll have executed for
+         * ratelimit_us. However, to avoid setting a really short timer, which
+         * will most likely be inaccurate and counterproductive, we never go
+         * below CSCHED_MIN_TIMER.
+         */
+        tslice = MICROSECS(prv->ratelimit_us) - runtime;
+        if ( unlikely(runtime < CSCHED_MIN_TIMER) )
+            tslice = CSCHED_MIN_TIMER;
         ret.migrated = 0;
         goto out;
     }