From patchwork Fri May 4 14:24:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 908778 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linutronix.de Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cvSQ6s2Rz9s3D for ; Sat, 5 May 2018 00:25:42 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751652AbeEDOZO (ORCPT ); Fri, 4 May 2018 10:25:14 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:40841 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751461AbeEDOZM (ORCPT ); Fri, 4 May 2018 10:25:12 -0400 Received: from localhost ([127.0.0.1] helo=bazinga.breakpoint.cc) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1fEbe0-0005Vc-OB; Fri, 04 May 2018 16:25:09 +0200 From: Sebastian Andrzej Siewior To: linux-ide@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tglx@linutronix.de, "David S. Miller" , Sebastian Andrzej Siewior Subject: [PATCH 1/4] alim15x3: move irq-restore before pci_dev_put() Date: Fri, 4 May 2018 16:24:43 +0200 Message-Id: <20180504142446.30525-2-bigeasy@linutronix.de> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504142446.30525-1-bigeasy@linutronix.de> References: <20180504142446.30525-1-bigeasy@linutronix.de> MIME-Version: 1.0 Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org init_chipset_ali15x3() initializes the chipset during init with disabled interrupts. There is no need to keep the interrupts disabled during pci_dev_put(). Move the irq-restore before pci_dev_put() is invoked. Side note: The same init is performed in drivers/ata/pata_ali.c::ali_init_chipset() without disabled interrupts. It looks that the same hardware is supported in the ATA land. Would it make sense to remove this driver since it is supported in the other subsystem? Signed-off-by: Sebastian Andrzej Siewior Acked-by: David S. Miller --- drivers/ide/alim15x3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ide/alim15x3.c b/drivers/ide/alim15x3.c index 36f76e28a0bf..3265970aee34 100644 --- a/drivers/ide/alim15x3.c +++ b/drivers/ide/alim15x3.c @@ -323,9 +323,9 @@ static int init_chipset_ali15x3(struct pci_dev *dev) pci_write_config_byte(dev, 0x53, tmpbyte); } + local_irq_restore(flags); pci_dev_put(north); pci_dev_put(isa_dev); - local_irq_restore(flags); return 0; } From patchwork Fri May 4 14:24:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 908780 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linutronix.de Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cvSr3xfQz9s4n for ; Sat, 5 May 2018 00:26:04 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751808AbeEDOZo (ORCPT ); Fri, 4 May 2018 10:25:44 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:40843 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751272AbeEDOZN (ORCPT ); Fri, 4 May 2018 10:25:13 -0400 Received: from localhost ([127.0.0.1] helo=bazinga.breakpoint.cc) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1fEbe1-0005Vc-O6; Fri, 04 May 2018 16:25:09 +0200 From: Sebastian Andrzej Siewior To: linux-ide@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tglx@linutronix.de, "David S. Miller" , Sebastian Andrzej Siewior Subject: [PATCH 2/4] ide: Handle irq disabling consistently Date: Fri, 4 May 2018 16:24:44 +0200 Message-Id: <20180504142446.30525-3-bigeasy@linutronix.de> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504142446.30525-1-bigeasy@linutronix.de> References: <20180504142446.30525-1-bigeasy@linutronix.de> MIME-Version: 1.0 Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org ide_timer_expiry() disables interrupt at function entry when acquiring hwif->lock. Before disabling the device interrupt it unlocks hwif->lock, but interrupts stay disabled. After the call to disable_irq() interrupts are disabled again, which is a pointless exercise. After the device irq handler has been invoked with interrupts disabled, hwif->lock is acquired again with spin_lock_irq() because the device irq handler might have reenabled interrupts. This is not documented and confusing for the casual reader. Remove the redundant local_irq_disable() and add a comment which explains why hwif->lock has to be reacquired with spin_lock_irq(). Signed-off-by: Sebastian Andrzej Siewior Acked-by: David S. Miller --- drivers/ide/ide-io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 6f25da56a169..a444bad7a2aa 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -659,8 +659,7 @@ void ide_timer_expiry (struct timer_list *t) spin_unlock(&hwif->lock); /* disable_irq_nosync ?? */ disable_irq(hwif->irq); - /* local CPU only, as if we were handling an interrupt */ - local_irq_disable(); + if (hwif->polling) { startstop = handler(drive); } else if (drive_is_ready(drive)) { @@ -679,6 +678,7 @@ void ide_timer_expiry (struct timer_list *t) startstop = ide_error(drive, "irq timeout", hwif->tp_ops->read_status(hwif)); } + /* Disable interrupts again, `handler' might have enabled it */ spin_lock_irq(&hwif->lock); enable_irq(hwif->irq); if (startstop == ide_stopped && hwif->polling == 0) { From patchwork Fri May 4 14:24:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 908781 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linutronix.de Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cvTD4wNPz9s3D for ; Sat, 5 May 2018 00:26:24 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751791AbeEDOZo (ORCPT ); Fri, 4 May 2018 10:25:44 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:40845 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751644AbeEDOZO (ORCPT ); Fri, 4 May 2018 10:25:14 -0400 Received: from localhost ([127.0.0.1] helo=bazinga.breakpoint.cc) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1fEbe2-0005Vc-Lv; Fri, 04 May 2018 16:25:11 +0200 From: Sebastian Andrzej Siewior To: linux-ide@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tglx@linutronix.de, "David S. Miller" , Sebastian Andrzej Siewior Subject: [PATCH 3/4] ide: don't disable interrupts during kmap_atomic() Date: Fri, 4 May 2018 16:24:45 +0200 Message-Id: <20180504142446.30525-4-bigeasy@linutronix.de> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504142446.30525-1-bigeasy@linutronix.de> References: <20180504142446.30525-1-bigeasy@linutronix.de> MIME-Version: 1.0 Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org ide_pio_bytes() disables interrupts around kmap_atomic(). This is a leftover from the old kmap_atomic() implementation which relied on fixed mapping slots, so the caller had to make sure that the same slot could not be reused from an interrupting context. kmap_atomic() was changed to dynamic slots long ago and commit 1ec9c5ddc17a ("include/linux/highmem.h: remove the second argument of k[un]map_atomic()") removed the slot assignements, but the callers were not checked for now redundant interrupt disabling. Remove the conditional interrupt disable. Signed-off-by: Sebastian Andrzej Siewior Acked-by: David S. Miller --- drivers/ide/ide-taskfile.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index abe0822dd429..49f9b4739779 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -237,7 +237,6 @@ void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, while (len) { unsigned nr_bytes = min(len, cursg->length - cmd->cursg_ofs); - int page_is_high; page = sg_page(cursg); offset = cursg->offset + cmd->cursg_ofs; @@ -248,10 +247,6 @@ void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, nr_bytes = min_t(unsigned, nr_bytes, (PAGE_SIZE - offset)); - page_is_high = PageHighMem(page); - if (page_is_high) - local_irq_save(flags); - buf = kmap_atomic(page) + offset; cmd->nleft -= nr_bytes; @@ -270,9 +265,6 @@ void ide_pio_bytes(ide_drive_t *drive, struct ide_cmd *cmd, kunmap_atomic(buf); - if (page_is_high) - local_irq_restore(flags); - len -= nr_bytes; } } From patchwork Fri May 4 14:24:46 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 908777 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-ide-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=linutronix.de Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40cvSM6CWMz9s3D for ; Sat, 5 May 2018 00:25:39 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751354AbeEDOZ0 (ORCPT ); Fri, 4 May 2018 10:25:26 -0400 Received: from Galois.linutronix.de ([146.0.238.70]:40847 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751646AbeEDOZP (ORCPT ); Fri, 4 May 2018 10:25:15 -0400 Received: from localhost ([127.0.0.1] helo=bazinga.breakpoint.cc) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1fEbe4-0005Vc-BC; Fri, 04 May 2018 16:25:12 +0200 From: Sebastian Andrzej Siewior To: linux-ide@vger.kernel.org Cc: linux-kernel@vger.kernel.org, tglx@linutronix.de, "David S. Miller" , Sebastian Andrzej Siewior Subject: [PATCH 4/4] ide: don't enable/disable interrupts in force threaded-IRQ mode Date: Fri, 4 May 2018 16:24:46 +0200 Message-Id: <20180504142446.30525-5-bigeasy@linutronix.de> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180504142446.30525-1-bigeasy@linutronix.de> References: <20180504142446.30525-1-bigeasy@linutronix.de> MIME-Version: 1.0 Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org The interrupts are enabled/disabled so the interrupt handler can run with enabled interrupts while serving the interrupt and not lose other interrupts especially the timer tick. If the system runs with force-threaded interrupts then there is no need to enable the interrupts. Signed-off-by: Sebastian Andrzej Siewior Acked-by: David S. Miller --- drivers/ide/ide-iops.c | 13 +++++++++---- drivers/ide/ide-taskfile.c | 2 +- kernel/irq/manage.c | 1 + 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 210a0887dd29..d55e9ebd5628 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c @@ -108,6 +108,7 @@ int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, ide_hwif_t *hwif = drive->hwif; const struct ide_tp_ops *tp_ops = hwif->tp_ops; unsigned long flags; + bool irqs_threaded = force_irqthreads; int i; u8 stat; @@ -115,8 +116,10 @@ int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, stat = tp_ops->read_status(hwif); if (stat & ATA_BUSY) { - local_save_flags(flags); - local_irq_enable_in_hardirq(); + if (!irqs_threaded) { + local_save_flags(flags); + local_irq_enable_in_hardirq(); + } timeout += jiffies; while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) { if (time_after(jiffies, timeout)) { @@ -129,12 +132,14 @@ int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, if ((stat & ATA_BUSY) == 0) break; - local_irq_restore(flags); + if (!irqs_threaded) + local_irq_restore(flags); *rstat = stat; return -EBUSY; } } - local_irq_restore(flags); + if (!irqs_threaded) + local_irq_restore(flags); } /* * Allow status to settle, then read it again. diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 49f9b4739779..d42feeaebd36 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c @@ -405,7 +405,7 @@ static ide_startstop_t pre_task_out_intr(ide_drive_t *drive, return startstop; } - if ((drive->dev_flags & IDE_DFLAG_UNMASK) == 0) + if (!force_irqthreads && (drive->dev_flags & IDE_DFLAG_UNMASK) == 0) local_irq_disable(); ide_set_handler(drive, &task_pio_intr, WAIT_WORSTCASE); diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index e3336d904f64..4c2ef8084e32 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -24,6 +24,7 @@ #ifdef CONFIG_IRQ_FORCED_THREADING __read_mostly bool force_irqthreads; +EXPORT_SYMBOL_GPL(force_irqthreads); static int __init setup_forced_irqthreads(char *arg) {