From patchwork Tue May 7 00:07:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John David Anglin X-Patchwork-Id: 2529701 Return-Path: X-Original-To: patchwork-linux-parisc@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 65F883FC5A for ; Tue, 7 May 2013 00:08:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760034Ab3EGAIH (ORCPT ); Mon, 6 May 2013 20:08:07 -0400 Received: from blu0-omc4-s23.blu0.hotmail.com ([65.55.111.162]:10423 "EHLO blu0-omc4-s23.blu0.hotmail.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1759214Ab3EGAIG (ORCPT ); Mon, 6 May 2013 20:08:06 -0400 Received: from BLU0-SMTP29 ([65.55.111.136]) by blu0-omc4-s23.blu0.hotmail.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 6 May 2013 17:08:06 -0700 X-EIP: [xX+c699il5l5uCy/d6PKv8ry7paIOlvm] X-Originating-Email: [dave.anglin@bell.net] Message-ID: Received: from [192.168.2.10] ([69.158.130.254]) by BLU0-SMTP29.phx.gbl over TLS secured channel with Microsoft SMTPSVC(6.0.3790.4675); Mon, 6 May 2013 17:08:04 -0700 From: John David Anglin To: linux-parisc List Subject: [PATCH] parisc: only re-enable interrupts if we need to schedule or deliver signals when returning to userspace MIME-Version: 1.0 (Apple Message framework v936) Date: Mon, 6 May 2013 20:07:25 -0400 CC: Helge Deller , "James E.J. Bottomley" X-Mailer: Apple Mail (2.936) X-OriginalArrivalTime: 07 May 2013 00:08:04.0520 (UTC) FILETIME=[F2046280:01CE4AB6] Sender: linux-parisc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org Helge and I have found that we have a kernel stack overflow problem which causes a variety of random failures. Currently, we re-enable interrupts when returning from an external interrupt incase we need to schedule or delivery signals. As a result, a potentially unlimited number of interrupts can occur while we are running on the kernel stack. It is very limited in space (currently, 16k). This change defers enabling interrupts until we have actually decided to schedule or delivery signals. This only occurs when we about to return to userspace. This limits the number of interrupts on the kernel stack to one. In other cases, interrupts remain disabled until the final return from interrupt (rfi). Signed-off-by: John David Anglin --- -- John David Anglin dave.anglin@bell.net diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index f33201b..bd7bec3 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S @@ -825,11 +826,6 @@ ENTRY(syscall_exit_rfi) STREG %r19,PT_SR7(%r16) intr_return: - /* NOTE: Need to enable interrupts incase we schedule. */ - ssm PSW_SM_I, %r0 - -intr_check_resched: - /* check for reschedule */ mfctl %cr30,%r1 LDREG TI_FLAGS(%r1),%r19 /* sched.h: TIF_NEED_RESCHED */ @@ -856,6 +852,11 @@ intr_check_sig: LDREG PT_IASQ1(%r16), %r20 cmpib,COND(=),n 0,%r20,intr_restore /* backward */ + /* NOTE: We need to enable interrupts if we have to deliver + * signals. We used to do this earlier but it caused kernel + * stack overflows. */ + ssm PSW_SM_I, %r0 + copy %r0, %r25 /* long in_syscall = 0 */ #ifdef CONFIG_64BIT ldo -16(%r30),%r29 /* Reference param save area */ @@ -907,6 +908,10 @@ intr_do_resched: cmpib,COND(=) 0, %r20, intr_do_preempt nop + /* NOTE: We need to enable interrupts if we schedule. We used + * to do this earlier but it caused kernel stack overflows. */ + ssm PSW_SM_I, %r0 + #ifdef CONFIG_64BIT ldo -16(%r30),%r29 /* Reference param save area */ #endif