提交 36da91bd 编写于 作者: P Petr Mladek 提交者: Paolo Bonzini

KVM: x86: Handle the kthread worker using the new API

Use the new API to create and destroy the "kvm-pit" kthread
worker. The API hides some implementation details.

In particular, kthread_create_worker() allocates and initializes
struct kthread_worker. It runs the kthread the right way
and stores task_struct into the worker structure.

kthread_destroy_worker() flushes all pending works, stops
the kthread and frees the structure.

This patch does not change the existing behavior except for
dynamically allocating struct kthread_worker and storing
only the pointer of this structure.

It is compile tested only because I did not find an easy
way how to run the code. Well, it should be pretty safe
given the nature of the change.
Signed-off-by: NPetr Mladek <pmladek@suse.com>
Message-Id: <1476877847-11217-1-git-send-email-pmladek@suse.com>
Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
上级 16c2aec6
...@@ -212,7 +212,7 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian) ...@@ -212,7 +212,7 @@ static void kvm_pit_ack_irq(struct kvm_irq_ack_notifier *kian)
*/ */
smp_mb(); smp_mb();
if (atomic_dec_if_positive(&ps->pending) > 0) if (atomic_dec_if_positive(&ps->pending) > 0)
kthread_queue_work(&pit->worker, &pit->expired); kthread_queue_work(pit->worker, &pit->expired);
} }
void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu) void __kvm_migrate_pit_timer(struct kvm_vcpu *vcpu)
...@@ -272,7 +272,7 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data) ...@@ -272,7 +272,7 @@ static enum hrtimer_restart pit_timer_fn(struct hrtimer *data)
if (atomic_read(&ps->reinject)) if (atomic_read(&ps->reinject))
atomic_inc(&ps->pending); atomic_inc(&ps->pending);
kthread_queue_work(&pt->worker, &pt->expired); kthread_queue_work(pt->worker, &pt->expired);
if (ps->is_periodic) { if (ps->is_periodic) {
hrtimer_add_expires_ns(&ps->timer, ps->period); hrtimer_add_expires_ns(&ps->timer, ps->period);
...@@ -667,10 +667,8 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags) ...@@ -667,10 +667,8 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
pid_nr = pid_vnr(pid); pid_nr = pid_vnr(pid);
put_pid(pid); put_pid(pid);
kthread_init_worker(&pit->worker); pit->worker = kthread_create_worker(0, "kvm-pit/%d", pid_nr);
pit->worker_task = kthread_run(kthread_worker_fn, &pit->worker, if (IS_ERR(pit->worker))
"kvm-pit/%d", pid_nr);
if (IS_ERR(pit->worker_task))
goto fail_kthread; goto fail_kthread;
kthread_init_work(&pit->expired, pit_do_work); kthread_init_work(&pit->expired, pit_do_work);
...@@ -713,7 +711,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags) ...@@ -713,7 +711,7 @@ struct kvm_pit *kvm_create_pit(struct kvm *kvm, u32 flags)
fail_register_pit: fail_register_pit:
mutex_unlock(&kvm->slots_lock); mutex_unlock(&kvm->slots_lock);
kvm_pit_set_reinject(pit, false); kvm_pit_set_reinject(pit, false);
kthread_stop(pit->worker_task); kthread_destroy_worker(pit->worker);
fail_kthread: fail_kthread:
kvm_free_irq_source_id(kvm, pit->irq_source_id); kvm_free_irq_source_id(kvm, pit->irq_source_id);
fail_request: fail_request:
...@@ -730,8 +728,7 @@ void kvm_free_pit(struct kvm *kvm) ...@@ -730,8 +728,7 @@ void kvm_free_pit(struct kvm *kvm)
kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->speaker_dev); kvm_io_bus_unregister_dev(kvm, KVM_PIO_BUS, &pit->speaker_dev);
kvm_pit_set_reinject(pit, false); kvm_pit_set_reinject(pit, false);
hrtimer_cancel(&pit->pit_state.timer); hrtimer_cancel(&pit->pit_state.timer);
kthread_flush_work(&pit->expired); kthread_destroy_worker(pit->worker);
kthread_stop(pit->worker_task);
kvm_free_irq_source_id(kvm, pit->irq_source_id); kvm_free_irq_source_id(kvm, pit->irq_source_id);
kfree(pit); kfree(pit);
} }
......
...@@ -44,8 +44,7 @@ struct kvm_pit { ...@@ -44,8 +44,7 @@ struct kvm_pit {
struct kvm_kpit_state pit_state; struct kvm_kpit_state pit_state;
int irq_source_id; int irq_source_id;
struct kvm_irq_mask_notifier mask_notifier; struct kvm_irq_mask_notifier mask_notifier;
struct kthread_worker worker; struct kthread_worker *worker;
struct task_struct *worker_task;
struct kthread_work expired; struct kthread_work expired;
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册