Received: by 2002:a25:ef43:0:0:0:0:0 with SMTP id w3csp178959ybm; Tue, 26 May 2020 13:55:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw8mCSM8er8jFTyyiBENlihtc+fOUFLyZ2yOkr7MZO2mFtWnXbI5/FRx7TAWsNF1NWXViA1 X-Received: by 2002:aa7:da04:: with SMTP id r4mr21222959eds.346.1590526520073; Tue, 26 May 2020 13:55:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1590526520; cv=none; d=google.com; s=arc-20160816; b=l3mziWrKBmnw7xFFNoABObLGk99nlNzSkdXBnWuwAnEgxRgRpiCe6nnJKXbuvhlNeT HvpfBRost/WRNcNoCUAT+008ts7OQbXTop7BqqSRlV2Rk67Jgax9ZJ7reQw+fuKxgDkw +F7L2JmxCmVqwzTq8eOixm7X01nW3JxjQm7Wrz7YltIbBXYNxVTT1DBTn9ipP8UEDG7t 3ZqvT+WvzNjAeW3QobAkCahS0e5/Lc08bbW4l8242FRBMmq2HTI4+whvvqMjNqE7P+DE hmoch3lXYn6b4GmQI1xZw4BGfWYokr0diNagU1zZe6m8DJAkQCGKqePyb0yzlR3/8KEN i8xQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=CM5HWG1MlSsU67CSR1TdHbHGDKE5ScK9AppNri/Og3Y=; b=f+pv5hx8RG9tM1HSHUyLZ9+Pgc2k/05q4x1LofvwxuFmoQ8X/VSULQE2WB19DfK7w6 /w6F0QfoQ30j6jiKBkws9cPMj+X3yJUO3e68PTCzaaBV/JFbq4g75WGYsARio1yvKq14 8XpetzjGAC/JX6yYZk+qsxYXxz+Ht8SIPWgDWj3PgfL2mqJpYEYnkXfR7RzSuCeDkb99 1mHRr+q/yr8QIBHSI9+cruddgdlf9VqOmN1RK+Shx/bZPZxz0ytjhU/hR6qlkQXnjb73 RhbGAAFJcPHgicubouyyMPF+w1n9gTikUgt3STRLkxf+AiimPc0/A7/Z9v3+Xx4zVzUe 290w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UP2EUTK4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jr11si529855ejb.602.2020.05.26.13.54.56; Tue, 26 May 2020 13:55:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UP2EUTK4; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2392351AbgEZTSB (ORCPT + 99 others); Tue, 26 May 2020 15:18:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:44556 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2392004AbgEZTN5 (ORCPT ); Tue, 26 May 2020 15:13:57 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 950E5208C3; Tue, 26 May 2020 19:13:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1590520437; bh=aE1R5VaeXY/7No8XOaYL5qSng5iIu55Y54sVmyyaUHE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UP2EUTK4B9XlJBT0JUfxvnE1SFU8npAcLciRhHZYraElh8gSQ/zjDkzUD9ReNzS3B T7lU3QmRvva5zHDu6qSF+tgA8kCVwm6Oyzs5iH8jy78PcwI8vW/OBYKfgGt5Crazwj vyrCXHzui19Y4byx+wsJbX6u37h8YHZ6Z/SJJQh8= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sanjay Kumar , Dave Jiang , Vinod Koul Subject: [PATCH 5.6 080/126] dmaengine: idxd: fix interrupt completion after unmasking Date: Tue, 26 May 2020 20:53:37 +0200 Message-Id: <20200526183944.843946067@linuxfoundation.org> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200526183937.471379031@linuxfoundation.org> References: <20200526183937.471379031@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Dave Jiang commit 4f302642b70c1348773fe7e3ded9fc315fa92990 upstream. The current implementation may miss completions after we unmask the interrupt. In order to make sure we process all competions, we need to: 1. Do an MMIO read from the device as a barrier to ensure that all PCI writes for completions have arrived. 2. Check for any additional completions that we missed. Fixes: 8f47d1a5e545 ("dmaengine: idxd: connect idxd to dmaengine subsystem") Reported-by: Sanjay Kumar Signed-off-by: Dave Jiang Link: https://lore.kernel.org/r/158834641769.35613.1341160109892008587.stgit@djiang5-desk3.ch.intel.com Signed-off-by: Vinod Koul Signed-off-by: Greg Kroah-Hartman --- drivers/dma/idxd/device.c | 7 +++++++ drivers/dma/idxd/irq.c | 26 +++++++++++++++++++------- 2 files changed, 26 insertions(+), 7 deletions(-) --- a/drivers/dma/idxd/device.c +++ b/drivers/dma/idxd/device.c @@ -62,6 +62,13 @@ int idxd_unmask_msix_vector(struct idxd_ perm.ignore = 0; iowrite32(perm.bits, idxd->reg_base + offset); + /* + * A readback from the device ensures that any previously generated + * completion record writes are visible to software based on PCI + * ordering rules. + */ + perm.bits = ioread32(idxd->reg_base + offset); + return 0; } --- a/drivers/dma/idxd/irq.c +++ b/drivers/dma/idxd/irq.c @@ -173,6 +173,7 @@ static int irq_process_pending_llist(str struct llist_node *head; int queued = 0; + *processed = 0; head = llist_del_all(&irq_entry->pending_llist); if (!head) return 0; @@ -197,6 +198,7 @@ static int irq_process_work_list(struct struct list_head *node, *next; int queued = 0; + *processed = 0; if (list_empty(&irq_entry->work_list)) return 0; @@ -218,10 +220,9 @@ static int irq_process_work_list(struct return queued; } -irqreturn_t idxd_wq_thread(int irq, void *data) +static int idxd_desc_process(struct idxd_irq_entry *irq_entry) { - struct idxd_irq_entry *irq_entry = data; - int rc, processed = 0, retry = 0; + int rc, processed, total = 0; /* * There are two lists we are processing. The pending_llist is where @@ -244,15 +245,26 @@ irqreturn_t idxd_wq_thread(int irq, void */ do { rc = irq_process_work_list(irq_entry, &processed); - if (rc != 0) { - retry++; + total += processed; + if (rc != 0) continue; - } rc = irq_process_pending_llist(irq_entry, &processed); - } while (rc != 0 && retry != 10); + total += processed; + } while (rc != 0); + + return total; +} + +irqreturn_t idxd_wq_thread(int irq, void *data) +{ + struct idxd_irq_entry *irq_entry = data; + int processed; + processed = idxd_desc_process(irq_entry); idxd_unmask_msix_vector(irq_entry->idxd, irq_entry->id); + /* catch anything unprocessed after unmasking */ + processed += idxd_desc_process(irq_entry); if (processed == 0) return IRQ_NONE;