mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-21 01:54:51 +08:00
5fca9e5c69
Based on 1 normalized pattern(s): 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 extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 1 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Richard Fontana <rfontana@redhat.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190524100843.782742400@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
41 lines
1016 B
C
41 lines
1016 B
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Preemptible hypercalls
|
|
*
|
|
* Copyright (C) 2014 Citrix Systems R&D ltd.
|
|
*/
|
|
|
|
#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)
|
|
&& need_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 */
|