Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1948332imu; Thu, 17 Jan 2019 06:02:44 -0800 (PST) X-Google-Smtp-Source: ALg8bN7AUQyr6ir6Y5ommr2fc0Q5KEAGw3xcBF7ygrxOFHGdwI33Bmkalv9OJ1t/REVD9phg+cla X-Received: by 2002:a63:304:: with SMTP id 4mr3023568pgd.99.1547733764872; Thu, 17 Jan 2019 06:02:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547733764; cv=none; d=google.com; s=arc-20160816; b=GRwzOprh+hm93SwXsuzMrVq87zYDlCfrmDmzkywDhMWAaPsiByuW0lG+NPrShqbMvY Z9Op1MX91BkhYgu52Tu3kgYIy5COtdmyduzOkCrQniDcr83CAd3y9ZBad9qtQiobgpk0 KyBNdXIne5kKtleTb50JV3RkGw7SU5Mz5P4mqh1Tf7zh0OUB9VlwSaDfmNKH1u+Zq68/ fTaoMy7xFClfQNeWMg8Mgkq0o8zbMvCaJJaPgGrXUKqp+2OLjOtZBiYLopgZ8aulVJU8 S8f7eybSNv8OUu8KqRSOEzo6ft5jfuiYmzrD/3CPYD5UksGiupFwNmX5DTj7fKqeGwFz E/AQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=eZ1S5F//LoYipMuPbKMPoeyPvFUgvRY+s0jpcl8Bk1Q=; b=gKBNzVp+0n9o5EdPRMoZ1XfaMO+Xl+gk5d/cNN0Z2jtOVobZ+HWFbXk3immmg79fc8 pkNd5UvlIsmxpYEfdhB49w4xPmbbKuQc4C7hMrEzU/YdtUaKgPLEIFUuhYyGwbKt9ufB CO+4RGhP6IwydFJLJ+fYgbVPpd7iaULgWOlnK5XqGKZZW+1gs5vUNqP9XzkfoCtZjsrp /ZSC4uiMeqcZ7Va3GHLZG2pLtfF4p0tOmBM2i3Mdj6jFzHRiNivJDOXPGsD73ZrJyP5T 9U2Lc9KJjDRyMdTbLOI9elGAhYQwe9p9IcI/HMEppXfK7VYckTDs8khiaG3c28W5N9Wq WvVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=vmware.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 189si1766453pfd.142.2019.01.17.06.02.09; Thu, 17 Jan 2019 06:02:44 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=vmware.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727090AbfAQNEL (ORCPT + 99 others); Thu, 17 Jan 2019 08:04:11 -0500 Received: from ex13-edg-ou-002.vmware.com ([208.91.0.190]:2143 "EHLO EX13-EDG-OU-002.vmware.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726018AbfAQNEL (ORCPT ); Thu, 17 Jan 2019 08:04:11 -0500 Received: from sc9-mailhost2.vmware.com (10.113.161.72) by EX13-EDG-OU-002.vmware.com (10.113.208.156) with Microsoft SMTP Server id 15.0.1156.6; Thu, 17 Jan 2019 04:48:57 -0800 Received: from akaher-lnx-dev.eng.vmware.com (unknown [10.110.19.203]) by sc9-mailhost2.vmware.com (Postfix) with ESMTP id 4007BB1341; Thu, 17 Jan 2019 07:49:05 -0500 (EST) From: Ajay Kaher To: , CC: , , , Ajay Kaher , Long Li , Bjorn Helgaas Subject: [PATCH 1/3] PCI: hv: Allocate physically contiguous hypercall params buffer Date: Fri, 18 Jan 2019 02:17:16 +0530 Message-ID: <1547758038-5255-2-git-send-email-akaher@vmware.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1547758038-5255-1-git-send-email-akaher@vmware.com> References: <1547758038-5255-1-git-send-email-akaher@vmware.com> MIME-Version: 1.0 Content-Type: text/plain Received-SPF: None (EX13-EDG-OU-002.vmware.com: akaher@vmware.com does not designate permitted sender hosts) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org hv_do_hypercall() assumes that we pass a segment from a physically contiguous buffer. A buffer allocated on the stack may not work if CONFIG_VMAP_STACK=y is set. Use kmalloc() to allocate this buffer. Reported-by: Haiyang Zhang Signed-off-by: Long Li Signed-off-by: Bjorn Helgaas Acked-by: K. Y. Srinivasan Signed-off-by: Ajay Kaher --- drivers/pci/host/pci-hyperv.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/drivers/pci/host/pci-hyperv.c b/drivers/pci/host/pci-hyperv.c index b4d8ccf..9e44adf 100644 --- a/drivers/pci/host/pci-hyperv.c +++ b/drivers/pci/host/pci-hyperv.c @@ -383,6 +383,8 @@ struct hv_pcibus_device { struct msi_domain_info msi_info; struct msi_controller msi_chip; struct irq_domain *irq_domain; + struct retarget_msi_interrupt retarget_msi_interrupt_params; + spinlock_t retarget_msi_interrupt_lock; }; /* @@ -780,34 +782,40 @@ void hv_irq_unmask(struct irq_data *data) { struct msi_desc *msi_desc = irq_data_get_msi_desc(data); struct irq_cfg *cfg = irqd_cfg(data); - struct retarget_msi_interrupt params; + struct retarget_msi_interrupt *params; struct hv_pcibus_device *hbus; struct cpumask *dest; struct pci_bus *pbus; struct pci_dev *pdev; int cpu; + unsigned long flags; dest = irq_data_get_affinity_mask(data); pdev = msi_desc_to_pci_dev(msi_desc); pbus = pdev->bus; hbus = container_of(pbus->sysdata, struct hv_pcibus_device, sysdata); - memset(¶ms, 0, sizeof(params)); - params.partition_id = HV_PARTITION_ID_SELF; - params.source = 1; /* MSI(-X) */ - params.address = msi_desc->msg.address_lo; - params.data = msi_desc->msg.data; - params.device_id = (hbus->hdev->dev_instance.b[5] << 24) | + spin_lock_irqsave(&hbus->retarget_msi_interrupt_lock, flags); + + params = &hbus->retarget_msi_interrupt_params; + memset(params, 0, sizeof(*params)); + params->partition_id = HV_PARTITION_ID_SELF; + params->source = 1; /* MSI(-X) */ + params->address = msi_desc->msg.address_lo; + params->data = msi_desc->msg.data; + params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | (hbus->hdev->dev_instance.b[4] << 16) | (hbus->hdev->dev_instance.b[7] << 8) | (hbus->hdev->dev_instance.b[6] & 0xf8) | PCI_FUNC(pdev->devfn); - params.vector = cfg->vector; + params->vector = cfg->vector; for_each_cpu_and(cpu, dest, cpu_online_mask) - params.vp_mask |= (1ULL << vmbus_cpu_number_to_vp_number(cpu)); + params->vp_mask |= (1ULL << vmbus_cpu_number_to_vp_number(cpu)); + + hv_do_hypercall(HVCALL_RETARGET_INTERRUPT, params, NULL); - hv_do_hypercall(HVCALL_RETARGET_INTERRUPT, ¶ms, NULL); + spin_unlock_irqrestore(&hbus->retarget_msi_interrupt_lock, flags); pci_msi_unmask_irq(data); } @@ -2212,6 +2220,7 @@ static int hv_pci_probe(struct hv_device *hdev, INIT_LIST_HEAD(&hbus->resources_for_children); spin_lock_init(&hbus->config_lock); spin_lock_init(&hbus->device_list_lock); + spin_lock_init(&hbus->retarget_msi_interrupt_lock); sema_init(&hbus->enum_sem, 1); init_completion(&hbus->remove_event); -- 2.7.4