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

Re: [Xen-devel] [PATCH v2 2/5] xen: sched/credit1: make vcpu_migration_delay per-cpupool



On 02/28/2018 02:23 PM, George Dunlap wrote:
> On 02/23/2018 04:41 PM, Dario Faggioli wrote:
>> Right now, vCPU migration delay is controlled by
>> the vcpu_migration_delay boot parameter. This means
>> the same value will always be used for every instance
>> of Credit1, in any cpupool that will be created.
>>
>> Also, in order to get and set such value, a special
>> purpose libxc interface is defined, and used by the
>> xenpm tool. And this is problematic if Xen is built
>> without Credit1 support.
>>
>> This commit adds a vcpu_migr_delay field inside
>> struct csched_private, so that we can get/set the
>> migration delay indepently for each Credit1 instance,
>> in different cpupools.
>>
>> Getting and setting now happens via XEN_SYSCTL_SCHEDOP_*,
>> which is much better suited for this parameter.
>>
>> The value of the boot time parameter is used for
>> initializing the vcpu_migr_delay field of the private
>> structure of all the scheduler instances, when they're
>> created.
>>
>> While there, save reading NOW() and doing any s_time_t
>> operation, when the migration delay of a scheduler is
>> zero (as it is, by default), in
>> __csched_vcpu_is_cache_hot().
>>
>> Finally, note that, from this commit on, using `xenpm
>> {set,get}-vcpu-migration-delay' is not effective any
>> longer.
>>
>> Signed-off-by: Dario Faggioli <dfaggioli@xxxxxxxx>
>> ---
>> Cc: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
>> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
>> ---
>>  xen/common/sched_credit.c   |   38 +++++++++++++++++++++++++++-----------
>>  xen/include/public/sysctl.h |    3 +++
>>  2 files changed, 30 insertions(+), 11 deletions(-)
>>
>> diff --git a/xen/common/sched_credit.c b/xen/common/sched_credit.c
>> index a2c5d43e33..fd6dbd02aa 100644
>> --- a/xen/common/sched_credit.c
>> +++ b/xen/common/sched_credit.c
>> @@ -214,7 +214,7 @@ struct csched_private {
>>  
>>      /* Period of master and tick in milliseconds */
>>      unsigned int tick_period_us, ticks_per_tslice;
>> -    s_time_t ratelimit, tslice;
>> +    s_time_t ratelimit, tslice, vcpu_migr_delay;
>>  
>>      struct list_head active_sdom;
>>      uint32_t weight;
>> @@ -690,11 +690,11 @@ unsigned int get_vcpu_migration_delay(void)
>>      return vcpu_migration_delay;
>>  }
>>  
>> -static inline int
>> -__csched_vcpu_is_cache_hot(struct vcpu *v)
>> +static inline bool
>> +__csched_vcpu_is_cache_hot(const struct csched_private *prv, struct vcpu *v)
>>  {
>> -    int hot = ((NOW() - v->last_run_time) <
>> -               ((uint64_t)vcpu_migration_delay * 1000u));
>> +    bool hot = prv->vcpu_migr_delay &&
>> +               (NOW() - v->last_run_time) < prv->vcpu_migr_delay;
>>  
>>      if ( hot )
>>          SCHED_STAT_CRANK(vcpu_hot);
>> @@ -703,7 +703,8 @@ __csched_vcpu_is_cache_hot(struct vcpu *v)
>>  }
>>  
>>  static inline int
>> -__csched_vcpu_is_migrateable(struct vcpu *vc, int dest_cpu, cpumask_t *mask)
>> +__csched_vcpu_is_migrateable(const struct csched_private *prv, struct vcpu 
>> *vc,
>> +                             int dest_cpu, cpumask_t *mask)
>>  {
>>      /*
>>       * Don't pick up work that's hot on peer PCPU, or that can't (or
>> @@ -714,7 +715,7 @@ __csched_vcpu_is_migrateable(struct vcpu *vc, int 
>> dest_cpu, cpumask_t *mask)
>>       */
>>      ASSERT(!vc->is_running);
>>  
>> -    return !__csched_vcpu_is_cache_hot(vc) &&
>> +    return !__csched_vcpu_is_cache_hot(prv, vc) &&
>>             cpumask_test_cpu(dest_cpu, mask);
>>  }
>>  
>> @@ -1251,7 +1252,9 @@ csched_sys_cntl(const struct scheduler *ops,
>>               || (params->ratelimit_us
>>                   && (params->ratelimit_us > XEN_SYSCTL_SCHED_RATELIMIT_MAX
>>                       || params->ratelimit_us < 
>> XEN_SYSCTL_SCHED_RATELIMIT_MIN))
>> -             || MICROSECS(params->ratelimit_us) > 
>> MILLISECS(params->tslice_ms) )
>> +             || MICROSECS(params->ratelimit_us) > 
>> MILLISECS(params->tslice_ms)
>> +             || (params->vcpu_migr_delay_us
>> +                 && MICROSECS(params->vcpu_migr_delay_us) >= 
>> XEN_SYSCTL_CSCHED_MGR_DLY_MAX) )
>>                  goto out;
>>  
>>          spin_lock_irqsave(&prv->lock, flags);
>> @@ -1261,12 +1264,14 @@ csched_sys_cntl(const struct scheduler *ops,
>>          else if ( prv->ratelimit && !params->ratelimit_us )
>>              printk(XENLOG_INFO "Disabling context switch rate limiting\n");
>>          prv->ratelimit = MICROSECS(params->ratelimit_us);
>> +        prv->vcpu_migr_delay = MICROSECS(params->vcpu_migr_delay_us);
>>          spin_unlock_irqrestore(&prv->lock, flags);
>>  
>>          /* FALLTHRU */
>>      case XEN_SYSCTL_SCHEDOP_getinfo:
>>          params->tslice_ms = prv->tslice / MILLISECS(1);
>>          params->ratelimit_us = prv->ratelimit / MICROSECS(1);
>> +        params->vcpu_migr_delay_us = prv->vcpu_migr_delay / MICROSECS(1);
>>          rc = 0;
>>          break;
>>      }
>> @@ -1608,6 +1613,7 @@ csched_tick(void *_cpu)
>>  static struct csched_vcpu *
>>  csched_runq_steal(int peer_cpu, int cpu, int pri, int balance_step)
>>  {
>> +    const struct csched_private * const prv = 
>> CSCHED_PRIV(per_cpu(scheduler, cpu));
>>      const struct csched_pcpu * const peer_pcpu = CSCHED_PCPU(peer_cpu);
>>      struct csched_vcpu *speer;
>>      struct list_head *iter;
>> @@ -1657,7 +1663,7 @@ csched_runq_steal(int peer_cpu, int cpu, int pri, int 
>> balance_step)
>>              continue;
>>  
>>          affinity_balance_cpumask(vc, balance_step, cpumask_scratch);
>> -        if ( __csched_vcpu_is_migrateable(vc, cpu, cpumask_scratch) )
>> +        if ( __csched_vcpu_is_migrateable(prv, vc, cpu, cpumask_scratch) )
>>          {
>>              /* We got a candidate. Grab it! */
>>              TRACE_3D(TRC_CSCHED_STOLEN_VCPU, peer_cpu,
>> @@ -2114,7 +2120,7 @@ csched_dump(const struct scheduler *ops)
>>             "\tratelimit          = %"PRI_stime"us\n"
>>             "\tcredits per msec   = %d\n"
>>             "\tticks per tslice   = %d\n"
>> -           "\tmigration delay    = %uus\n",
>> +           "\tmigration delay    = %"PRI_stime"us\n",
>>             prv->ncpus,
>>             prv->master,
>>             prv->credit,
>> @@ -2126,7 +2132,7 @@ csched_dump(const struct scheduler *ops)
>>             prv->ratelimit / MICROSECS(1),
>>             CSCHED_CREDITS_PER_MSEC,
>>             prv->ticks_per_tslice,
>> -           vcpu_migration_delay);
>> +           prv->vcpu_migr_delay/ MICROSECS(1));
>>  
>>      cpumask_scnprintf(idlers_buf, sizeof(idlers_buf), prv->idlers);
>>      printk("idlers: %s\n", idlers_buf);
>> @@ -2209,6 +2215,16 @@ csched_init(struct scheduler *ops)
>>      }
>>      else
>>          prv->ratelimit = MICROSECS(sched_ratelimit_us);
>> +
>> +    if ( !vcpu_migration_delay && vcpu_migration_delay > MILLISECS(100) )
> 
> Also, this expression can never evaluate to true; the first element
> requires 0, the second requires non-zero.  I think you want to get rid
> of the `!`.

Or, by the same argument, get rid of the first clause altogether, as if
it's > 100 then it cannot possibly be zero. :-)

 -George

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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