From patchwork Tue Aug 2 17:23:37 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Auger X-Patchwork-Id: 9259399 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 664BB608A1 for ; Tue, 2 Aug 2016 17:28:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5642D28407 for ; Tue, 2 Aug 2016 17:28:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4AF2628489; Tue, 2 Aug 2016 17:28:43 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EE68F284DE for ; Tue, 2 Aug 2016 17:28:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S935757AbcHBR1o (ORCPT ); Tue, 2 Aug 2016 13:27:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42097 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756874AbcHBRZd (ORCPT ); Tue, 2 Aug 2016 13:25:33 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 08A8CC04B322; Tue, 2 Aug 2016 17:24:44 +0000 (UTC) Received: from localhost.redhat.com (vpn1-7-179.ams2.redhat.com [10.36.7.179]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u72HNgIW017433; Tue, 2 Aug 2016 13:24:39 -0400 From: Eric Auger To: eric.auger@redhat.com, eric.auger.pro@gmail.com, christoffer.dall@linaro.org, marc.zyngier@arm.com, robin.murphy@arm.com, alex.williamson@redhat.com, will.deacon@arm.com, joro@8bytes.org, tglx@linutronix.de, jason@lakedaemon.net, linux-arm-kernel@lists.infradead.org Cc: kvm@vger.kernel.org, drjones@redhat.com, linux-kernel@vger.kernel.org, Bharat.Bhushan@freescale.com, pranav.sawargaonkar@gmail.com, p.fedin@samsung.com, iommu@lists.linux-foundation.org, Jean-Philippe.Brucker@arm.com, yehuday@marvell.com, Manish.Jaggi@caviumnetworks.com, robert.richter@caviumnetworks.com, dennis.chen@arm.com Subject: [PATCH v12 11/11] genirq/msi: Use the MSI doorbell's IOVA when requested Date: Tue, 2 Aug 2016 17:23:37 +0000 Message-Id: <1470158617-7022-12-git-send-email-eric.auger@redhat.com> In-Reply-To: <1470158617-7022-1-git-send-email-eric.auger@redhat.com> References: <1470158617-7022-1-git-send-email-eric.auger@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Tue, 02 Aug 2016 17:24:44 +0000 (UTC) Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Currently the msi_compose() uses the doorbell's physical address. However in case the MSI doorbell is accessed through an IOMMU that does not bypass the MSI transactions we need to use an IOVA instead. iommu_msi_msg_pa_to_va helper, part of the iommu-msi API, detects the above case and swaps the MSI doorbell physical address with a pre-allocated/mapped IOVA. That way the device will send the MSI with this IOVA and the address will be translated by the IOMMU into the target MSI doorbell PA. Signed-off-by: Eric Auger --- v11 -> v12: - remove WARN_ON. iommu domain cannot dissapear while msi still are enabled so the userspace cannot induce a kernel panic. v8 -> v9: - Braces on both sides of the 'else' in msi_compose v7 -> v8: - use iommu_msi_msg_pa_to_va - add WARN_ON v6 -> v7: - allocation/mapping is done at an earlier stage. We now just perform the iova lookup. So it is safe now to be called in a code that cannot sleep. iommu_msi_set_doorbell_iova is moved in the dma-reserved-iommu API: I think it cleans things up with respect to various #ifdef CONFIGS. v5: - use macros to increase the readability - add comments - fix a typo that caused a compilation error if CONFIG_IOMMU_API is not set --- kernel/irq/msi.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c index 6a3cb14..02c1c71 100644 --- a/kernel/irq/msi.c +++ b/kernel/irq/msi.c @@ -63,10 +63,18 @@ static int msi_compose(struct irq_data *irq_data, { int ret = 0; - if (erase) + if (erase) { memset(msg, 0, sizeof(*msg)); - else + } else { + struct device *dev; + ret = irq_chip_compose_msi_msg(irq_data, msg); + if (ret) + return ret; + + dev = msi_desc_to_dev(irq_data_get_msi_desc(irq_data)); + ret = iommu_msi_msg_pa_to_va(dev, msg); + } return ret; }