From mboxrd@z Thu Jan 1 00:00:00 1970 From: David Vrabel Subject: [PATCH 3/3] xen/events: schedule if the interrupted task is in a preemptible hypercall Date: Tue, 11 Feb 2014 19:19:12 +0000 Message-ID: <1392146352-16381-4-git-send-email-david.vrabel@citrix.com> References: <1392146352-16381-1-git-send-email-david.vrabel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1392146352-16381-1-git-send-email-david.vrabel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Andrew Cooper , Boris Ostrovsky , Stefano Stabellini , David Vrabel List-Id: xen-devel@lists.xenproject.org From: Andrew Cooper In evtchn_do_upcall(), if the interrupted task was in a preemptible hypercall add a conditional schedule point. This allows tasks in long running preemptible hypercalls to be descheduled. Allowing other tasks to run and prevents long running hypercalls issued via the privcmd driver from triggering soft lockups. Signed-off-by: Andrew Cooper Signed-off-by: David Vrabel --- drivers/xen/events/events_base.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c index 4672e00..0b5df37 100644 --- a/drivers/xen/events/events_base.c +++ b/drivers/xen/events/events_base.c @@ -1254,6 +1254,12 @@ void xen_evtchn_do_upcall(struct pt_regs *regs) irq_exit(); set_irq_regs(old_regs); + +#ifndef CONFIG_PREEMPT + if ( __this_cpu_read(xed_nesting_count) == 0 + && is_preemptible_hypercall(regs) ) + _cond_resched(); +#endif } void xen_hvm_evtchn_do_upcall(void) -- 1.7.2.5