From patchwork Wed Jun 8 12:53:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Beulich X-Patchwork-Id: 9164525 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 BC38560467 for ; Wed, 8 Jun 2016 12:55:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id ACBF328179 for ; Wed, 8 Jun 2016 12:55:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A16BE2823D; Wed, 8 Jun 2016 12:55:40 +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 32E2028179 for ; Wed, 8 Jun 2016 12:55:40 +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 1bAczO-0007YW-Ph; Wed, 08 Jun 2016 12:53:42 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bAczN-0007YJ-Iy for xen-devel@lists.xenproject.org; Wed, 08 Jun 2016 12:53:41 +0000 Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id E5/0E-19610-55518575; Wed, 08 Jun 2016 12:53:41 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrJIsWRWlGSWpSXmKPExsXS6fjDSzdENCL coHkyi8X3LZOZHBg9Dn+4whLAGMWamZeUX5HAmvHw9zn2gnNGFd//L2ZuYPyq2cXIwSEkkCfx udO+i5GTg1fATmLjm9ksILaEgKHEvvmr2EBKWARUJd5PjQUJswmoS7Q9284KEhYRMJA4dzQJx GQW0JfYtg6sURjIbOy8zQxiCwEN7DzVD2ZzCthL/GxdzQhSzisgKPF3hzBImBmo5Om5X8wTGH lmIWRmIclA2FoSD3/dYoGwtSWWLXzNPAtsr7TE8n8cEGEHiUvXprCiKgGxvSX+XP3DvICRYxW jenFqUVlqka6pXlJRZnpGSW5iZo6uoaGJXm5qcXFiempOYlKxXnJ+7iZGYJAyAMEOxnWLnQ8x SnIwKYnyKrqHhwvxJeWnVGYkFmfEF5XmpBYfYpTh4FCS4DUSiQgXEixKTU+tSMvMAcYLTFqCg 0dJhHcmSJq3uCAxtzgzHSJ1ilFRSpy3ESQhAJLIKM2Da4PF6CVGWSlhXkagQ4R4ClKLcjNLUO VfMYpzMCoJ85qATOHJzCuBm/4KaDET0OLlR8JBFpckIqSkGhijUo/Ktvy4fK9CaNdDk5PXeHT 352gvLxSrvWHPfbLBwVvhRvHEJXyrfxh5iV85zfUzsrxut8TuvqaC/HihP6YywX9bSyaufP39 /J47i2+flNSq/dW6/9PjGFE5C3uRY5/P8udkn56386+DT0vhuvl3E49uru+rz74Quegj44Ibe n8P+vudzNVRYinOSDTUYi4qTgQAUNeHccwCAAA= X-Env-Sender: JBeulich@suse.com X-Msg-Ref: server-9.tower-27.messagelabs.com!1465390418!46497844!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.46; banners=-,-,- X-VirusChecked: Checked Received: (qmail 61531 invoked from network); 8 Jun 2016 12:53:39 -0000 Received: from prv-mh.provo.novell.com (HELO prv-mh.provo.novell.com) (137.65.248.74) by server-9.tower-27.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 8 Jun 2016 12:53:39 -0000 Received: from INET-PRV-MTA by prv-mh.provo.novell.com with Novell_GroupWise; Wed, 08 Jun 2016 06:53:37 -0600 Message-Id: <5758316F02000078000F30A6@prv-mh.provo.novell.com> X-Mailer: Novell GroupWise Internet Agent 14.2.0 Date: Wed, 08 Jun 2016 06:53:35 -0600 From: "Jan Beulich" To: "xen-devel" References: <5758302D02000078000F3087@prv-mh.provo.novell.com> In-Reply-To: <5758302D02000078000F3087@prv-mh.provo.novell.com> Mime-Version: 1.0 Cc: Andrew Cooper Subject: [Xen-devel] [PATCH 2/4] x86/vMSI-X: drop list lock 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 msixtbl_pt_{,un}register() already run with both the PCI devices lock and the domain event lock held, so there's no need for another lock. Just to be on the safe side, acquire the domain event lock in the cleanup function (albeit I don't think this is strictly necessary). Signed-off-by: Jan Beulich x86/vMSI-X: drop list lock msixtbl_pt_{,un}register() already run with both the PCI devices lock and the domain event lock held, so there's no need for another lock. Just to be on the safe side, acquire the domain event lock in the cleanup function (albeit I don't think this is strictly necessary). Signed-off-by: Jan Beulich --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -468,8 +468,6 @@ int msixtbl_pt_register(struct domain *d pdev = msi_desc->dev; - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); - list_for_each_entry( entry, &d->arch.hvm_domain.msixtbl_list, list ) if ( pdev == entry->pdev ) goto found; @@ -480,7 +478,6 @@ int msixtbl_pt_register(struct domain *d found: atomic_inc(&entry->refcnt); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); r = 0; out: @@ -530,15 +527,10 @@ void msixtbl_pt_unregister(struct domain pdev = msi_desc->dev; - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); - list_for_each_entry( entry, &d->arch.hvm_domain.msixtbl_list, list ) if ( pdev == entry->pdev ) goto found; - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); - - out: spin_unlock_irq(&irq_desc->lock); return; @@ -547,7 +539,6 @@ found: if ( !atomic_dec_and_test(&entry->refcnt) ) del_msixtbl_entry(entry); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); spin_unlock_irq(&irq_desc->lock); } @@ -558,7 +549,6 @@ void msixtbl_init(struct domain *d) return; INIT_LIST_HEAD(&d->arch.hvm_domain.msixtbl_list); - spin_lock_init(&d->arch.hvm_domain.msixtbl_list_lock); register_mmio_handler(d, &msixtbl_mmio_ops); } @@ -566,21 +556,17 @@ void msixtbl_init(struct domain *d) void msixtbl_pt_cleanup(struct domain *d) { struct msixtbl_entry *entry, *temp; - unsigned long flags; if ( !d->arch.hvm_domain.msixtbl_list.next ) return; - /* msixtbl_list_lock must be acquired with irq_disabled for check_lock() */ - local_irq_save(flags); - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); + spin_lock(&d->event_lock); list_for_each_entry_safe( entry, temp, &d->arch.hvm_domain.msixtbl_list, list ) del_msixtbl_entry(entry); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); - local_irq_restore(flags); + spin_unlock(&d->event_lock); } void msix_write_completion(struct vcpu *v) --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -124,7 +124,6 @@ struct hvm_domain { /* hypervisor intercepted msix table */ struct list_head msixtbl_list; - spinlock_t msixtbl_list_lock; struct viridian_domain viridian; Reviewed-by: Andrew Cooper --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -468,8 +468,6 @@ int msixtbl_pt_register(struct domain *d pdev = msi_desc->dev; - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); - list_for_each_entry( entry, &d->arch.hvm_domain.msixtbl_list, list ) if ( pdev == entry->pdev ) goto found; @@ -480,7 +478,6 @@ int msixtbl_pt_register(struct domain *d found: atomic_inc(&entry->refcnt); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); r = 0; out: @@ -530,15 +527,10 @@ void msixtbl_pt_unregister(struct domain pdev = msi_desc->dev; - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); - list_for_each_entry( entry, &d->arch.hvm_domain.msixtbl_list, list ) if ( pdev == entry->pdev ) goto found; - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); - - out: spin_unlock_irq(&irq_desc->lock); return; @@ -547,7 +539,6 @@ found: if ( !atomic_dec_and_test(&entry->refcnt) ) del_msixtbl_entry(entry); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); spin_unlock_irq(&irq_desc->lock); } @@ -558,7 +549,6 @@ void msixtbl_init(struct domain *d) return; INIT_LIST_HEAD(&d->arch.hvm_domain.msixtbl_list); - spin_lock_init(&d->arch.hvm_domain.msixtbl_list_lock); register_mmio_handler(d, &msixtbl_mmio_ops); } @@ -566,21 +556,17 @@ void msixtbl_init(struct domain *d) void msixtbl_pt_cleanup(struct domain *d) { struct msixtbl_entry *entry, *temp; - unsigned long flags; if ( !d->arch.hvm_domain.msixtbl_list.next ) return; - /* msixtbl_list_lock must be acquired with irq_disabled for check_lock() */ - local_irq_save(flags); - spin_lock(&d->arch.hvm_domain.msixtbl_list_lock); + spin_lock(&d->event_lock); list_for_each_entry_safe( entry, temp, &d->arch.hvm_domain.msixtbl_list, list ) del_msixtbl_entry(entry); - spin_unlock(&d->arch.hvm_domain.msixtbl_list_lock); - local_irq_restore(flags); + spin_unlock(&d->event_lock); } void msix_write_completion(struct vcpu *v) --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -124,7 +124,6 @@ struct hvm_domain { /* hypervisor intercepted msix table */ struct list_head msixtbl_list; - spinlock_t msixtbl_list_lock; struct viridian_domain viridian;