|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/sched: rework and rename vcpu_force_reschedule()
On 13.09.2019 14:14, Juergen Gross wrote:
> ---
> - Carved out from my core scheduling series
> - Reworked to avoid deadlock when 2 vcpus are trying to modify each
> others periodic timers, leading to address all comments by Jan
> Beulich.
Oh, indeed - a mutual vcpu_pause() can't end well.
> @@ -724,24 +725,6 @@ static void vcpu_migrate_finish(struct vcpu *v)
> vcpu_wake(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.
> - */
> -void vcpu_force_reschedule(struct vcpu *v)
> -{
> - spinlock_t *lock = vcpu_schedule_lock_irq(v);
> -
> - if ( v->is_running )
> - vcpu_migrate_start(v);
> -
> - vcpu_schedule_unlock_irq(lock, v);
> -
> - vcpu_migrate_finish(v);
> -}
So the comment specifically said this approach was chosen to
avoid the need for synchronization. You now introduce
synchronization. I'm not severely opposed, but I think there
wants to be justification why the added synchronization is not
a problem (and would perhaps never have been).
> @@ -1458,14 +1441,11 @@ long sched_adjust_global(struct
> xen_sysctl_scheduler_op *op)
> return rc;
> }
>
> -static void vcpu_periodic_timer_work(struct vcpu *v)
> +static void vcpu_periodic_timer_work_locked(struct vcpu *v)
> {
> s_time_t now;
> s_time_t periodic_next_event;
>
> - if ( v->periodic_period == 0 )
> - return;
I'm afraid you can't pull this out of here, or ...
> @@ -1476,10 +1456,36 @@ static void vcpu_periodic_timer_work(struct vcpu *v)
> periodic_next_event = now + v->periodic_period;
> }
>
> - migrate_timer(&v->periodic_timer, smp_processor_id());
> + migrate_timer(&v->periodic_timer, v->processor);
> set_timer(&v->periodic_timer, periodic_next_event);
> }
>
> +static void vcpu_periodic_timer_work(struct vcpu *v)
> +{
> + if ( v->periodic_period == 0 )
> + return;
> +
> + spin_lock(&v->periodic_timer_lock);
... the conditional here needs to move into the locked region.
Otherwise, despite having found non-zero above, by the time the
lock was acquired the value may have changed to zero.
As to the migrate_timer() change: Other than I feared, using
v->processor of a non-running vCPU does not look to have any
chance of acting on an offline CPU, thanks to
cpu_disable_scheduler() dealing with all vCPU-s (and not just
running ones), and thanks to CPU offlining happening in
stop-machine context.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |