Re: [ANNOUNCE] 3.14.39-rt38

From: Paul Gortmaker
Date: Thu May 28 2015 - 11:06:44 EST


On 15-05-20 10:55 AM, Steven Rostedt wrote:
>
> Dear RT Folks,
>
> I'm pleased to announce the 3.14.39-rt38 stable release.

[...]

>
> Changes from v3.14.39-rt37:
>
> ---
>
> Marcelo Tosatti (2):
> KVM: lapic: mark LAPIC timer handler as irqsafe
> KVM: use simple waitqueue for vcpu->wq
>
> Mike Galbraith (2):
> hotplug: Use set_cpus_allowed_ptr() in sync_unplug_thread()
> rt, nohz_full: fix nohz_full for PREEMPT_RT_FULL
>
> Sebastian Andrzej Siewior (1):
> kernel/irq_work: fix no_hz deadlock

Seems we can't use this commit above as-is on 3.14 (and earlier?)
since we'll get this:

kernel/time/tick-sched.c: In function ‘can_stop_full_tick’:
kernel/time/tick-sched.c:183:2: error: implicit declaration of function ‘arch_irq_work_has_interrupt’ [-Werror=implicit-function-declaration]
if (!arch_irq_work_has_interrupt()) {
^
cc1: some warnings being treated as errors
make[2]: *** [kernel/time/tick-sched.o] Error 1

Problem arises because that fcn doesn't come in until 3.18+ with
the merge v3.18-rc1~114 (in the 2nd commit):

git log --oneline --reverse v3.18-rc1~114^2 ^v3.18-rc1~114^
a80e49e2cc31 nohz: Move nohz full init call to tick init
c5c38ef3d703 irq_work: Introduce arch_irq_work_has_interrupt()
76a33061b932 irq_work: Force raised irq work to run on irq work interrupt
3010279f0fc3 x86: Tell irq work about self IPI support
09f6edd42421 arm: Tell irq work about self IPI support
3631073659d0 arm64: Tell irq work about self IPI support
4327b15f64b2 nohz: Consolidate nohz full init code
9b01f5bf3999 nohz: nohz full depends on irq work self IPI support

Not sure whether we want to backport more stuff or change the
original backport to not use arch_irq_work_has_interrupt...

Config is basically a defconfig but with RT_FULL and NOHZ_FULL =y.

Paul.
--

>
> Steven Rostedt (Red Hat) (1):
> Linux 3.14.39-rt38
>
> ----
> arch/arm/kernel/smp.c | 2 --
> arch/arm/kvm/arm.c | 4 ++--
> arch/arm/kvm/psci.c | 4 ++--
> arch/powerpc/include/asm/kvm_host.h | 4 ++--
> arch/powerpc/kernel/time.c | 2 +-
> arch/powerpc/kvm/book3s_hv.c | 20 ++++++++--------
> arch/s390/include/asm/kvm_host.h | 2 +-
> arch/sparc/kernel/pcr.c | 2 --
> arch/x86/kernel/irq_work.c | 2 --
> arch/x86/kvm/lapic.c | 48 ++++++++++++++++++++++++++++++++-----
> include/linux/kvm_host.h | 4 ++--
> kernel/cpu.c | 2 +-
> kernel/irq_work.c | 5 +---
> kernel/sched/core.c | 29 +++++++++++++++++-----
> kernel/time/tick-sched.c | 10 ++++++++
> kernel/timer.c | 2 +-
> localversion-rt | 2 +-
> virt/kvm/async_pf.c | 4 ++--
> virt/kvm/kvm_main.c | 16 ++++++-------
> 19 files changed, 109 insertions(+), 55 deletions(-)
> ---------------------------
> diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c
> index 686f1d1eb32e..8cd3724714fe 100644
> --- a/arch/arm/kernel/smp.c
> +++ b/arch/arm/kernel/smp.c
> @@ -463,14 +463,12 @@ void arch_send_call_function_single_ipi(int cpu)
> }
>
> #ifdef CONFIG_IRQ_WORK
> -#ifndef CONFIG_PREEMPT_RT_FULL
> void arch_irq_work_raise(void)
> {
> if (is_smp())
> smp_cross_call(cpumask_of(smp_processor_id()), IPI_IRQ_WORK);
> }
> #endif
> -#endif
>
> static const char *ipi_types[NR_IPI] = {
> #define S(x,s) [x] = s
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index bd18bb8b2770..9100f8a609a2 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -495,9 +495,9 @@ static int kvm_vcpu_first_run_init(struct kvm_vcpu *vcpu)
>
> static void vcpu_pause(struct kvm_vcpu *vcpu)
> {
> - wait_queue_head_t *wq = kvm_arch_vcpu_wq(vcpu);
> + struct swait_head *wq = kvm_arch_vcpu_wq(vcpu);
>
> - wait_event_interruptible(*wq, !vcpu->arch.pause);
> + swait_event_interruptible(*wq, !vcpu->arch.pause);
> }
>
> static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
> diff --git a/arch/arm/kvm/psci.c b/arch/arm/kvm/psci.c
> index 448f60e8d23c..19c6c9c2118c 100644
> --- a/arch/arm/kvm/psci.c
> +++ b/arch/arm/kvm/psci.c
> @@ -36,7 +36,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)
> {
> struct kvm *kvm = source_vcpu->kvm;
> struct kvm_vcpu *vcpu = NULL, *tmp;
> - wait_queue_head_t *wq;
> + struct swait_head *wq;
> unsigned long cpu_id;
> unsigned long mpidr;
> phys_addr_t target_pc;
> @@ -80,7 +80,7 @@ static unsigned long kvm_psci_vcpu_on(struct kvm_vcpu *source_vcpu)
> smp_mb(); /* Make sure the above is visible */
>
> wq = kvm_arch_vcpu_wq(vcpu);
> - wake_up_interruptible(wq);
> + swait_wake_interruptible(wq);
>
> return KVM_PSCI_RET_SUCCESS;
> }
> diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
> index 1eaea2dea174..dfaf2c2d8e7f 100644
> --- a/arch/powerpc/include/asm/kvm_host.h
> +++ b/arch/powerpc/include/asm/kvm_host.h
> @@ -295,7 +295,7 @@ struct kvmppc_vcore {
> u8 in_guest;
> struct list_head runnable_threads;
> spinlock_t lock;
> - wait_queue_head_t wq;
> + struct swait_head wq;
> u64 stolen_tb;
> u64 preempt_tb;
> struct kvm_vcpu *runner;
> @@ -612,7 +612,7 @@ struct kvm_vcpu_arch {
> u8 prodded;
> u32 last_inst;
>
> - wait_queue_head_t *wqp;
> + struct swait_head *wqp;
> struct kvmppc_vcore *vcore;
> int ret;
> int trap;
> diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c
> index 6d37d7603a8f..5bec5fd82a7e 100644
> --- a/arch/powerpc/kernel/time.c
> +++ b/arch/powerpc/kernel/time.c
> @@ -423,7 +423,7 @@ unsigned long profile_pc(struct pt_regs *regs)
> EXPORT_SYMBOL(profile_pc);
> #endif
>
> -#if defined(CONFIG_IRQ_WORK) && !defined(CONFIG_PREEMPT_RT_FULL)
> +#if defined(CONFIG_IRQ_WORK)
>
> /*
> * 64-bit uses a byte in the PACA, 32-bit uses a per-cpu variable...
> diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
> index 7a25d9218a05..0019281510da 100644
> --- a/arch/powerpc/kvm/book3s_hv.c
> +++ b/arch/powerpc/kvm/book3s_hv.c
> @@ -74,11 +74,11 @@ static void kvmppc_fast_vcpu_kick_hv(struct kvm_vcpu *vcpu)
> {
> int me;
> int cpu = vcpu->cpu;
> - wait_queue_head_t *wqp;
> + struct swait_head *wqp;
>
> wqp = kvm_arch_vcpu_wq(vcpu);
> - if (waitqueue_active(wqp)) {
> - wake_up_interruptible(wqp);
> + if (swaitqueue_active(wqp)) {
> + swait_wake_interruptible(wqp);
> ++vcpu->stat.halt_wakeup;
> }
>
> @@ -583,8 +583,8 @@ int kvmppc_pseries_do_hcall(struct kvm_vcpu *vcpu)
> tvcpu->arch.prodded = 1;
> smp_mb();
> if (vcpu->arch.ceded) {
> - if (waitqueue_active(&vcpu->wq)) {
> - wake_up_interruptible(&vcpu->wq);
> + if (swaitqueue_active(&vcpu->wq)) {
> + swait_wake_interruptible(&vcpu->wq);
> vcpu->stat.halt_wakeup++;
> }
> }
> @@ -1199,7 +1199,7 @@ static struct kvm_vcpu *kvmppc_core_vcpu_create_hv(struct kvm *kvm,
> if (vcore) {
> INIT_LIST_HEAD(&vcore->runnable_threads);
> spin_lock_init(&vcore->lock);
> - init_waitqueue_head(&vcore->wq);
> + init_swait_head(&vcore->wq);
> vcore->preempt_tb = TB_NIL;
> vcore->lpcr = kvm->arch.lpcr;
> vcore->first_vcpuid = core * threads_per_core;
> @@ -1566,13 +1566,13 @@ static void kvmppc_wait_for_exec(struct kvm_vcpu *vcpu, int wait_state)
> */
> static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
> {
> - DEFINE_WAIT(wait);
> + DEFINE_SWAITER(wait);
>
> - prepare_to_wait(&vc->wq, &wait, TASK_INTERRUPTIBLE);
> + swait_prepare(&vc->wq, &wait, TASK_INTERRUPTIBLE);
> vc->vcore_state = VCORE_SLEEPING;
> spin_unlock(&vc->lock);
> schedule();
> - finish_wait(&vc->wq, &wait);
> + swait_finish(&vc->wq, &wait);
> spin_lock(&vc->lock);
> vc->vcore_state = VCORE_INACTIVE;
> }
> @@ -1613,7 +1613,7 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
> kvmppc_create_dtl_entry(vcpu, vc);
> kvmppc_start_thread(vcpu);
> } else if (vc->vcore_state == VCORE_SLEEPING) {
> - wake_up(&vc->wq);
> + swait_wake(&vc->wq);
> }
>
> }
> diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
> index eef3dd3fd9a9..65402d300a26 100644
> --- a/arch/s390/include/asm/kvm_host.h
> +++ b/arch/s390/include/asm/kvm_host.h
> @@ -233,7 +233,7 @@ struct kvm_s390_local_interrupt {
> atomic_t active;
> struct kvm_s390_float_interrupt *float_int;
> int timer_due; /* event indicator for waitqueue below */
> - wait_queue_head_t *wq;
> + struct swait_head *wq;
> atomic_t *cpuflags;
> unsigned int action_bits;
> };
> diff --git a/arch/sparc/kernel/pcr.c b/arch/sparc/kernel/pcr.c
> index 927d9c5e50f5..7e967c8018c8 100644
> --- a/arch/sparc/kernel/pcr.c
> +++ b/arch/sparc/kernel/pcr.c
> @@ -43,12 +43,10 @@ void __irq_entry deferred_pcr_work_irq(int irq, struct pt_regs *regs)
> set_irq_regs(old_regs);
> }
>
> -#ifndef CONFIG_PREEMPT_RT_FULL
> void arch_irq_work_raise(void)
> {
> set_softint(1 << PIL_DEFERRED_PCR_WORK);
> }
> -#endif
>
> const struct pcr_ops *pcr_ops;
> EXPORT_SYMBOL_GPL(pcr_ops);
> diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c
> index 3d21f7bd7b42..1de84e3ab4e0 100644
> --- a/arch/x86/kernel/irq_work.c
> +++ b/arch/x86/kernel/irq_work.c
> @@ -38,7 +38,6 @@ __visible void smp_trace_irq_work_interrupt(struct pt_regs *regs)
> exiting_irq();
> }
>
> -#ifndef CONFIG_PREEMPT_RT_FULL
> void arch_irq_work_raise(void)
> {
> #ifdef CONFIG_X86_LOCAL_APIC
> @@ -49,4 +48,3 @@ void arch_irq_work_raise(void)
> apic_wait_icr_idle();
> #endif
> }
> -#endif
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 453e5fbbb7ae..8b25d010d5e4 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -1031,8 +1031,38 @@ static void update_divide_count(struct kvm_lapic *apic)
> apic->divide_count);
> }
>
> +
> +static enum hrtimer_restart apic_timer_fn(struct hrtimer *data);
> +
> +static void apic_timer_expired(struct hrtimer *data)
> +{
> + int ret, i = 0;
> + enum hrtimer_restart r;
> + struct kvm_timer *ktimer = container_of(data, struct kvm_timer, timer);
> +
> + r = apic_timer_fn(data);
> +
> + if (r == HRTIMER_RESTART) {
> + do {
> + ret = hrtimer_start_expires(data, HRTIMER_MODE_ABS);
> + if (ret == -ETIME)
> + hrtimer_add_expires_ns(&ktimer->timer,
> + ktimer->period);
> + i++;
> + } while (ret == -ETIME && i < 10);
> +
> + if (ret == -ETIME) {
> + printk_once(KERN_ERR "%s: failed to reprogram timer\n",
> + __func__);
> + WARN_ON_ONCE(1);
> + }
> + }
> +}
> +
> +
> static void start_apic_timer(struct kvm_lapic *apic)
> {
> + int ret;
> ktime_t now;
> atomic_set(&apic->lapic_timer.pending, 0);
>
> @@ -1062,9 +1092,11 @@ static void start_apic_timer(struct kvm_lapic *apic)
> }
> }
>
> - hrtimer_start(&apic->lapic_timer.timer,
> + ret = hrtimer_start(&apic->lapic_timer.timer,
> ktime_add_ns(now, apic->lapic_timer.period),
> HRTIMER_MODE_ABS);
> + if (ret == -ETIME)
> + apic_timer_expired(&apic->lapic_timer.timer);
>
> apic_debug("%s: bus cycle is %" PRId64 "ns, now 0x%016"
> PRIx64 ", "
> @@ -1094,8 +1126,10 @@ static void start_apic_timer(struct kvm_lapic *apic)
> ns = (tscdeadline - guest_tsc) * 1000000ULL;
> do_div(ns, this_tsc_khz);
> }
> - hrtimer_start(&apic->lapic_timer.timer,
> + ret = hrtimer_start(&apic->lapic_timer.timer,
> ktime_add_ns(now, ns), HRTIMER_MODE_ABS);
> + if (ret == -ETIME)
> + apic_timer_expired(&apic->lapic_timer.timer);
>
> local_irq_restore(flags);
> }
> @@ -1533,7 +1567,7 @@ static enum hrtimer_restart apic_timer_fn(struct hrtimer *data)
> struct kvm_timer *ktimer = container_of(data, struct kvm_timer, timer);
> struct kvm_lapic *apic = container_of(ktimer, struct kvm_lapic, lapic_timer);
> struct kvm_vcpu *vcpu = apic->vcpu;
> - wait_queue_head_t *q = &vcpu->wq;
> + struct swait_head *q = &vcpu->wq;
>
> /*
> * There is a race window between reading and incrementing, but we do
> @@ -1547,8 +1581,8 @@ static enum hrtimer_restart apic_timer_fn(struct hrtimer *data)
> kvm_make_request(KVM_REQ_PENDING_TIMER, vcpu);
> }
>
> - if (waitqueue_active(q))
> - wake_up_interruptible(q);
> + if (swaitqueue_active(q))
> + swait_wake_interruptible(q);
>
> if (lapic_is_periodic(apic)) {
> hrtimer_add_expires_ns(&ktimer->timer, ktimer->period);
> @@ -1581,6 +1615,7 @@ int kvm_create_lapic(struct kvm_vcpu *vcpu)
> hrtimer_init(&apic->lapic_timer.timer, CLOCK_MONOTONIC,
> HRTIMER_MODE_ABS);
> apic->lapic_timer.timer.function = apic_timer_fn;
> + apic->lapic_timer.timer.irqsafe = 1;
>
> /*
> * APIC is created enabled. This will prevent kvm_lapic_set_base from
> @@ -1699,7 +1734,8 @@ void __kvm_migrate_apic_timer(struct kvm_vcpu *vcpu)
>
> timer = &vcpu->arch.apic->lapic_timer.timer;
> if (hrtimer_cancel(timer))
> - hrtimer_start_expires(timer, HRTIMER_MODE_ABS);
> + if (hrtimer_start_expires(timer, HRTIMER_MODE_ABS) == -ETIME)
> + apic_timer_expired(timer);
> }
>
> /*
> diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
> index b8e9a43e501a..aebf20c9bfab 100644
> --- a/include/linux/kvm_host.h
> +++ b/include/linux/kvm_host.h
> @@ -231,7 +231,7 @@ struct kvm_vcpu {
>
> int fpu_active;
> int guest_fpu_loaded, guest_xcr0_loaded;
> - wait_queue_head_t wq;
> + struct swait_head wq;
> struct pid *pid;
> int sigset_active;
> sigset_t sigset;
> @@ -677,7 +677,7 @@ static inline bool kvm_arch_has_noncoherent_dma(struct kvm *kvm)
> }
> #endif
>
> -static inline wait_queue_head_t *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu)
> +static inline struct swait_head *kvm_arch_vcpu_wq(struct kvm_vcpu *vcpu)
> {
> #ifdef __KVM_HAVE_ARCH_WQP
> return vcpu->arch.wqp;
> diff --git a/kernel/cpu.c b/kernel/cpu.c
> index 285e18b2c420..a3890754e407 100644
> --- a/kernel/cpu.c
> +++ b/kernel/cpu.c
> @@ -242,7 +242,7 @@ static int sync_unplug_thread(void *data)
> * we don't want any more work on this CPU.
> */
> current->flags &= ~PF_NO_SETAFFINITY;
> - do_set_cpus_allowed(current, cpu_present_mask);
> + set_cpus_allowed_ptr(current, cpu_present_mask);
> migrate_me();
> return 0;
> }
> diff --git a/kernel/irq_work.c b/kernel/irq_work.c
> index 35d21f93bbe8..5f7d93d89c7f 100644
> --- a/kernel/irq_work.c
> +++ b/kernel/irq_work.c
> @@ -16,6 +16,7 @@
> #include <linux/tick.h>
> #include <linux/cpu.h>
> #include <linux/notifier.h>
> +#include <linux/interrupt.h>
> #include <asm/processor.h>
>
>
> @@ -51,11 +52,7 @@ static bool irq_work_claim(struct irq_work *work)
> return true;
> }
>
> -#ifdef CONFIG_PREEMPT_RT_FULL
> -void arch_irq_work_raise(void)
> -#else
> void __weak arch_irq_work_raise(void)
> -#endif
> {
> /*
> * Lame architectures will get the timer tick callback
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 883669d3e293..71c0bb1cdeb0 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -696,17 +696,34 @@ static inline bool got_nohz_idle_kick(void)
> #endif /* CONFIG_NO_HZ_COMMON */
>
> #ifdef CONFIG_NO_HZ_FULL
> +
> +static int ksoftirqd_running(void)
> +{
> + struct task_struct *softirqd;
> +
> + if (!IS_ENABLED(CONFIG_PREEMPT_RT_FULL))
> + return 0;
> + softirqd = this_cpu_ksoftirqd();
> + if (softirqd && softirqd->on_rq)
> + return 1;
> + return 0;
> +}
> +
> bool sched_can_stop_tick(void)
> {
> - struct rq *rq;
> + struct rq *rq;
>
> - rq = this_rq();
> + rq = this_rq();
>
> - /* Make sure rq->nr_running update is visible after the IPI */
> - smp_rmb();
> + /* Make sure rq->nr_running update is visible after the IPI */
> + smp_rmb();
>
> - /* More than one running task need preemption */
> - if (rq->nr_running > 1)
> + /*
> + * More than one running task need preemption
> + *
> + * NOTE, RT: if ksoftirqd is awake, subtract it.
> + */
> + if (rq->nr_running - ksoftirqd_running() > 1)
> return false;
>
> return true;
> diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
> index ab32130964b6..57d5bb1b3919 100644
> --- a/kernel/time/tick-sched.c
> +++ b/kernel/time/tick-sched.c
> @@ -180,6 +180,11 @@ static bool can_stop_full_tick(void)
> return false;
> }
>
> + if (!arch_irq_work_has_interrupt()) {
> + trace_tick_stop(0, "missing irq work interrupt\n");
> + return false;
> + }
> +
> /* sched_clock_tick() needs us? */
> #ifdef CONFIG_HAVE_UNSTABLE_SCHED_CLOCK
> /*
> @@ -221,7 +226,12 @@ void __tick_nohz_full_check(void)
>
> static void nohz_full_kick_work_func(struct irq_work *work)
> {
> + unsigned long flags;
> +
> + /* ksoftirqd processes sirqs with interrupts enabled */
> + local_irq_save(flags);
> __tick_nohz_full_check();
> + local_irq_restore(flags);
> }
>
> static DEFINE_PER_CPU(struct irq_work, nohz_full_kick_work) = {
> diff --git a/kernel/timer.c b/kernel/timer.c
> index 34fd2dbba3e3..36b9f10bb3c7 100644
> --- a/kernel/timer.c
> +++ b/kernel/timer.c
> @@ -1450,7 +1450,7 @@ void update_process_times(int user_tick)
> scheduler_tick();
> run_local_timers();
> rcu_check_callbacks(cpu, user_tick);
> -#if defined(CONFIG_IRQ_WORK)
> +#if defined(CONFIG_IRQ_WORK) && !defined(CONFIG_PREEMPT_RT_FULL)
> if (in_irq())
> irq_work_run();
> #endif
> diff --git a/localversion-rt b/localversion-rt
> index a3b2408c1da6..49bae8d6aa67 100644
> --- a/localversion-rt
> +++ b/localversion-rt
> @@ -1 +1 @@
> --rt37
> +-rt38
> diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c
> index f2c80d5451c3..10634baf3b08 100644
> --- a/virt/kvm/async_pf.c
> +++ b/virt/kvm/async_pf.c
> @@ -82,8 +82,8 @@ static void async_pf_execute(struct work_struct *work)
>
> trace_kvm_async_pf_completed(addr, gva);
>
> - if (waitqueue_active(&vcpu->wq))
> - wake_up_interruptible(&vcpu->wq);
> + if (swaitqueue_active(&vcpu->wq))
> + swait_wake_interruptible(&vcpu->wq);
>
> mmput(mm);
> kvm_put_kvm(vcpu->kvm);
> diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
> index 66112533b1e9..38a0d7a5ce74 100644
> --- a/virt/kvm/kvm_main.c
> +++ b/virt/kvm/kvm_main.c
> @@ -219,7 +219,7 @@ int kvm_vcpu_init(struct kvm_vcpu *vcpu, struct kvm *kvm, unsigned id)
> vcpu->kvm = kvm;
> vcpu->vcpu_id = id;
> vcpu->pid = NULL;
> - init_waitqueue_head(&vcpu->wq);
> + init_swait_head(&vcpu->wq);
> kvm_async_pf_vcpu_init(vcpu);
>
> page = alloc_page(GFP_KERNEL | __GFP_ZERO);
> @@ -1675,10 +1675,10 @@ EXPORT_SYMBOL_GPL(mark_page_dirty);
> */
> void kvm_vcpu_block(struct kvm_vcpu *vcpu)
> {
> - DEFINE_WAIT(wait);
> + DEFINE_SWAITER(wait);
>
> for (;;) {
> - prepare_to_wait(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
> + swait_prepare(&vcpu->wq, &wait, TASK_INTERRUPTIBLE);
>
> if (kvm_arch_vcpu_runnable(vcpu)) {
> kvm_make_request(KVM_REQ_UNHALT, vcpu);
> @@ -1692,7 +1692,7 @@ void kvm_vcpu_block(struct kvm_vcpu *vcpu)
> schedule();
> }
>
> - finish_wait(&vcpu->wq, &wait);
> + swait_finish(&vcpu->wq, &wait);
> }
> EXPORT_SYMBOL_GPL(kvm_vcpu_block);
>
> @@ -1704,11 +1704,11 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
> {
> int me;
> int cpu = vcpu->cpu;
> - wait_queue_head_t *wqp;
> + struct swait_head *wqp;
>
> wqp = kvm_arch_vcpu_wq(vcpu);
> - if (waitqueue_active(wqp)) {
> - wake_up_interruptible(wqp);
> + if (swaitqueue_active(wqp)) {
> + swait_wake_interruptible(wqp);
> ++vcpu->stat.halt_wakeup;
> }
>
> @@ -1814,7 +1814,7 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me)
> continue;
> if (vcpu == me)
> continue;
> - if (waitqueue_active(&vcpu->wq))
> + if (swaitqueue_active(&vcpu->wq))
> continue;
> if (!kvm_vcpu_eligible_for_directed_yield(vcpu))
> continue;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/