From patchwork Fri Jul 8 06:45:13 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 9220111 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 DF6686044F for ; Fri, 8 Jul 2016 06:47:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CE9F3284C0 for ; Fri, 8 Jul 2016 06:47:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C2FDC284C4; Fri, 8 Jul 2016 06:47:33 +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=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 31185284C0 for ; Fri, 8 Jul 2016 06:47:33 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bLPXI-00044e-Ll; Fri, 08 Jul 2016 06:45:16 +0000 Received: from mail6.bemta6.messagelabs.com ([85.158.143.247]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bLPXH-00044T-Fs for xen-devel@lists.xenproject.org; Fri, 08 Jul 2016 06:45:15 +0000 Received: from [85.158.143.35] by server-2.bemta-6.messagelabs.com id E8/00-11548-AFB4F775; Fri, 08 Jul 2016 06:45:14 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrOIsWRWlGSWpSXmKPExsXS6fjDS/eXd32 4wZ3pnBbft0xmcmD0OPzhCksAYxRrZl5SfkUCa0ZvSwNjwXPdioWb37E0MC5T7mLk5BASyJOY sLOVtYuRg4NXwE5i/QuwsISAocS++avYQGwWAVWJ418/sIDYbALqEm3PtoOViwgYSJw7mgQSZ hZwlTh3dgsziC0sYCZx/nkbE8R0O4l51xvB4pwC9hJXvvUxQmwSlPi7Qxii1U5i55vfbBMYeW YhZGYhyUDYWhIPf91igbC1JZYtfM0MUs4sIC2x/B8HRNhb4sS5bkZUJSB2mERHzyXmBYwcqxj Vi1OLylKLdA31kooy0zNKchMzc3QNDcz0clOLixPTU3MSk4r1kvNzNzECA5UBCHYw7nzudIhR koNJSZRXwb8uXIgvKT+lMiOxOCO+qDQntfgQowYHh8C2XasvMEqx5OXnpSpJ8H7wqg8XEixKT U+tSMvMAcYSTKkEB4+SCK82MJ6EeIsLEnOLM9MhUqcYFaXEee+A9AmAJDJK8+DaYPF7iVFWSp iXEegoIZ6C1KLczBJU+VeM4hyMSsK8W0Cm8GTmlcBNfwW0mAlo8U+XapDFJYkIKakGRvWMZfn tpyUnc/XuWJZoKH5gdoJR6Qntg6sSIl58NLLz+DLHqU+/o7H4sZlg287whkkCW270vZ4hHzJV ZeKsWR0aa9kfrHwY161ov+dr1jbWmhLBZu9iy5jstT4nGB8mB/c0KlrJmukrS+du2lh3dPkTV wsrZqGbhmy+gYELBD+LPQvZ41qnxFKckWioxVxUnAgATuc6QNoCAAA= X-Env-Sender: JBeulich@suse.com X-Msg-Ref: server-11.tower-21.messagelabs.com!1467960312!22850387!1 X-Originating-IP: [137.65.248.74] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 32510 invoked from network); 8 Jul 2016 06:45:13 -0000 Received: from prv-mh.provo.novell.com (HELO prv-mh.provo.novell.com) (137.65.248.74) by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 8 Jul 2016 06:45:13 -0000 Received: from INET-PRV-MTA by prv-mh.provo.novell.com with Novell_GroupWise; Fri, 08 Jul 2016 00:45:11 -0600 Message-Id: <577F681902000078000FC752@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.0 Date: Fri, 08 Jul 2016 00:45:13 -0600 From: "Jan Beulich" To: "xen-devel" References: <577F66BC02000078000FC743@prv-mh.provo.novell.com> In-Reply-To: <577F66BC02000078000FC743@prv-mh.provo.novell.com> Mime-Version: 1.0 Cc: Kevin Tian , Feng Wu Subject: [Xen-devel] [PATCH v15 2/3] IOMMU: add domain crash logic X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Quan Xu Add domain crash logic to the generic IOMMU layer to benefit all platforms. No spamming of the log can occur. For DomU, we avoid logging any message for already dying domains. For Dom0, that'll still be more verbose than we'd really like, but it at least wouldn't outright flood the console. Signed-off-by: Quan Xu Acked-by: Kevin Tian Reviewed-by: Jan Beulich IOMMU: add domain crash logic From: Quan Xu Add domain crash logic to the generic IOMMU layer to benefit all platforms. No spamming of the log can occur. For DomU, we avoid logging any message for already dying domains. For Dom0, that'll still be more verbose than we'd really like, but it at least wouldn't outright flood the console. Signed-off-by: Quan Xu Acked-by: Kevin Tian Reviewed-by: Jan Beulich --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -318,21 +318,47 @@ int iommu_iotlb_flush(struct domain *d, unsigned int page_count) { const struct domain_iommu *hd = dom_iommu(d); + int rc; if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush ) return 0; - return hd->platform_ops->iotlb_flush(d, gfn, page_count); + rc = hd->platform_ops->iotlb_flush(d, gfn, page_count); + if ( unlikely(rc) ) + { + if ( !d->is_shutting_down && printk_ratelimit() ) + printk(XENLOG_ERR + "d%d: IOMMU IOTLB flush failed: %d, gfn %#lx, page count %u\n", + d->domain_id, rc, gfn, page_count); + + if ( !is_hardware_domain(d) ) + domain_crash(d); + } + + return rc; } int iommu_iotlb_flush_all(struct domain *d) { const struct domain_iommu *hd = dom_iommu(d); + int rc; if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all ) return 0; - return hd->platform_ops->iotlb_flush_all(d); + rc = hd->platform_ops->iotlb_flush_all(d); + if ( unlikely(rc) ) + { + if ( !d->is_shutting_down && printk_ratelimit() ) + printk(XENLOG_ERR + "d%d: IOMMU IOTLB flush all failed: %d\n", + d->domain_id, rc); + + if ( !is_hardware_domain(d) ) + domain_crash(d); + } + + return rc; } int __init iommu_setup(void) --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1848,6 +1848,17 @@ int iommu_pte_flush(struct domain *d, u6 } } + if ( unlikely(rc) ) + { + if ( !d->is_shutting_down && printk_ratelimit() ) + printk(XENLOG_ERR VTDPREFIX + " d%d: IOMMU pages flush failed: %d\n", + d->domain_id, rc); + + if ( !is_hardware_domain(d) ) + domain_crash(d); + } + return rc; } --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -318,21 +318,47 @@ int iommu_iotlb_flush(struct domain *d, unsigned int page_count) { const struct domain_iommu *hd = dom_iommu(d); + int rc; if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush ) return 0; - return hd->platform_ops->iotlb_flush(d, gfn, page_count); + rc = hd->platform_ops->iotlb_flush(d, gfn, page_count); + if ( unlikely(rc) ) + { + if ( !d->is_shutting_down && printk_ratelimit() ) + printk(XENLOG_ERR + "d%d: IOMMU IOTLB flush failed: %d, gfn %#lx, page count %u\n", + d->domain_id, rc, gfn, page_count); + + if ( !is_hardware_domain(d) ) + domain_crash(d); + } + + return rc; } int iommu_iotlb_flush_all(struct domain *d) { const struct domain_iommu *hd = dom_iommu(d); + int rc; if ( !iommu_enabled || !hd->platform_ops || !hd->platform_ops->iotlb_flush_all ) return 0; - return hd->platform_ops->iotlb_flush_all(d); + rc = hd->platform_ops->iotlb_flush_all(d); + if ( unlikely(rc) ) + { + if ( !d->is_shutting_down && printk_ratelimit() ) + printk(XENLOG_ERR + "d%d: IOMMU IOTLB flush all failed: %d\n", + d->domain_id, rc); + + if ( !is_hardware_domain(d) ) + domain_crash(d); + } + + return rc; } int __init iommu_setup(void) --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1848,6 +1848,17 @@ int iommu_pte_flush(struct domain *d, u6 } } + if ( unlikely(rc) ) + { + if ( !d->is_shutting_down && printk_ratelimit() ) + printk(XENLOG_ERR VTDPREFIX + " d%d: IOMMU pages flush failed: %d\n", + d->domain_id, rc); + + if ( !is_hardware_domain(d) ) + domain_crash(d); + } + return rc; }