-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/xen: allow privcmd hypercalls to be preempted
Hypercalls submitted by user space tools via the privcmd driver can take a long time (potentially many 10s of seconds) if the hypercall has many sub-operations. A fully preemptible kernel may deschedule such as task in any upcall called from a hypercall continuation. However, in a kernel with voluntary or no preemption, hypercall continuations in Xen allow event handlers to be run but the task issuing the hypercall will not be descheduled until the hypercall is complete and the ioctl returns to user space. These long running tasks may also trigger the kernel's soft lockup detection. Add xen_preemptible_hcall_begin() and xen_preemptible_hcall_end() to bracket hypercalls that may be preempted. Use these in the privcmd driver. When returning from an upcall, call xen_maybe_preempt_hcall() which adds a schedule point if if the current task was within a preemptible hypercall. Since _cond_resched() can move the task to a different CPU, clear and set xen_in_preemptible_hcall around the call. Signed-off-by: David Vrabel <david.vrabel@citrix.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
- Loading branch information
David Vrabel
committed
Feb 23, 2015
1 parent
31795b4
commit fdfd811
Showing
6 changed files
with
79 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
/* | ||
* Preemptible hypercalls | ||
* | ||
* Copyright (C) 2014 Citrix Systems R&D ltd. | ||
* | ||
* This source code is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or (at your option) any later version. | ||
*/ | ||
|
||
#include <linux/sched.h> | ||
#include <xen/xen-ops.h> | ||
|
||
#ifndef CONFIG_PREEMPT | ||
|
||
/* | ||
* Some hypercalls issued by the toolstack can take many 10s of | ||
* seconds. Allow tasks running hypercalls via the privcmd driver to | ||
* be voluntarily preempted even if full kernel preemption is | ||
* disabled. | ||
* | ||
* Such preemptible hypercalls are bracketed by | ||
* xen_preemptible_hcall_begin() and xen_preemptible_hcall_end() | ||
* calls. | ||
*/ | ||
|
||
DEFINE_PER_CPU(bool, xen_in_preemptible_hcall); | ||
EXPORT_SYMBOL_GPL(xen_in_preemptible_hcall); | ||
|
||
asmlinkage __visible void xen_maybe_preempt_hcall(void) | ||
{ | ||
if (unlikely(__this_cpu_read(xen_in_preemptible_hcall) | ||
&& should_resched())) { | ||
/* | ||
* Clear flag as we may be rescheduled on a different | ||
* cpu. | ||
*/ | ||
__this_cpu_write(xen_in_preemptible_hcall, false); | ||
_cond_resched(); | ||
__this_cpu_write(xen_in_preemptible_hcall, true); | ||
} | ||
} | ||
#endif /* CONFIG_PREEMPT */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters