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

Re: [Xen-devel] [PATCH v2 26/48] xen/sched: rework and rename vcpu_force_reschedule()



On 09.08.2019 16:58, Juergen Gross wrote:
> vcpu_force_reschedule() is only used for modifying the periodic timer
> of a vcpu.

I don't think this is true prior to this patch, or else ...

> @@ -419,8 +419,6 @@ int pv_shim_shutdown(uint8_t reason)
>  
>          if ( v != current )
>              vcpu_unpause_by_systemcontroller(v);
> -        else
> -            vcpu_force_reschedule(v);

... there wouldn't be this deletion of code. Without further
explanation it's unclear to me whether the re-schedule here
isn't also needed for other than processing the reset of the
periodic timer period.

> --- a/xen/common/schedule.c
> +++ b/xen/common/schedule.c
> @@ -877,21 +877,25 @@ static void vcpu_migrate_finish(struct vcpu *v)
>  }
>  
>  /*
> - * Force a VCPU through a deschedule/reschedule path.
> - * For example, using this when setting the periodic timer period means that
> - * most periodic-timer state need only be touched from within the scheduler
> - * which can thus be done without need for synchronisation.
> + * Set the periodic timer of a vcpu.
>   */
> -void vcpu_force_reschedule(struct vcpu *v)
> +void vcpu_set_periodic_timer(struct vcpu *v, s_time_t value)
>  {
> -    spinlock_t *lock = unit_schedule_lock_irq(v->sched_unit);
> +    s_time_t now;
>  
> -    if ( v->sched_unit->is_running )
> -        vcpu_migrate_start(v);
> +    if ( v != current )
> +        vcpu_pause(v);
> +    else
> +        stop_timer(&v->periodic_timer);
>  
> -    unit_schedule_unlock_irq(lock, v->sched_unit);
> +    now = NOW();
> +    v->periodic_period = value;
> +    v->periodic_last_event = now;

I'm afraid this alters an implicit property of the previous
implementation: periodic_last_event would get re-set only when
the newly calculated next event wouldn't be in the future. The
goal of this (aiui) is to not disturb a periodic timer which
gets (redundantly) set again to the same period.

> -    vcpu_migrate_finish(v);
> +    if ( v != current )
> +        vcpu_unpause(v);
> +    else if ( value != 0 )
> +        set_timer(&v->periodic_timer, now + value);
>  }

While perhaps not overly important, another difference to
vcpu_periodic_timer_work() is the lack of migrate_timer() here.
There would indeed be no migration needed if a periodic timer
was active already (and if v == current), because it would
have been migrated during the most recent scheduling cycle. But
in case this is an off->on transition, no such migration may
have occurred before.

Finally a remark towards ordering in the series: This looks to
be textually but not functionally dependent upon earlier
patches in the series. Such patches, when placed early in a
series, have a fair chance of going in ahead of the bulk of
such series.

Jan

_______________________________________________
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®.