Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755195AbcC3WLg (ORCPT ); Wed, 30 Mar 2016 18:11:36 -0400 Received: from p3plsmtps2ded04.prod.phx3.secureserver.net ([208.109.80.198]:34420 "EHLO p3plsmtps2ded04.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755144AbcC3WLe (ORCPT ); Wed, 30 Mar 2016 18:11:34 -0400 x-originating-ip: 72.167.245.219 From: Jake Oshins To: linux-pci@vger.kernel.org, gregkh@linuxfoundation.org, kys@microsoft.com, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com, haiyangz@microsoft.com, haddenh@microsoft.com Cc: Jake Oshins Subject: [PATCH v2 0/7] drivers:hv: Ensure that bridge windows don't overlap Date: Wed, 30 Mar 2016 16:48:40 -0700 Message-Id: <1459381727-25039-1-git-send-email-jakeo@microsoft.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: References: X-CMAE-Envelope: MS4wfKIthkmqwDJ8NQvkdO1GU2fOfmfBY3zN1pq9jSVostKcGqgiU6qY/vndEOE9ovmbLOB9sjO74Ftv9hJUps1nEiQyfziRaukje0sSo8s0IbJDaLPwqTlt pxjBDmjIXiYpzifUhocazh4FtmnjvHicq+BYnbDwWqxGtju9KtjJ4guXr/L+GqPVhgF4kcS0gWSfxhscbEfCOwM8QQKVK9m9xf39YFfqSgkKvOYpf1HJ9KKF wYyVoGMBLHbMw9cLOBL/GS6Tjz6Rz5vTsbbD/0FUj1qeGbjYjUspiDAl8ql+E3HY7K6d8F9BFejC3utKKgSX8ZtGaTlwuFArDw9PLLx+b8a0n/j60Ogm4s49 sYPYgam7GoMBItirKbHk7rkEYljv5qaSH3uOachDDcFz/ruZ4CnQtVPKDphAjO0jjooZ99Am9LhRjInmYR5WyvbFe/uAuhZk65OzJiYiwCIsGMpksfVWWzWC ewBLnTKLOm8Dx6mWWAALZaR+hCXCl1GY5Y850dL1uXccp6Fvk4qu9x6FPUo= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2903 Lines: 58 This series differs from v1 in that the last two patches have been modified to simplify the tracking of the frame buffer area during early boot, which is done so that other devices which may get probed and started first don't choose memory space that's in use by that frame buffer. Hyper-V VMs expose paravirtual drivers through a mechanism called VMBus, which is managed by hv_vmbus.ko. For each parvirtual service instance, this driver exposes a new child device. Some of these child devices need memory address space, into which Hyper-V will map things like the virtual video frame buffer. This memory-mapped address space is chosen by the guest OS, not the hypervisor. This is difficult to map onto the Linux pnp layer, as the code in the pnp layer to choose MMIO space keys off of bus type and it doesn't know anything about VMBus. The maintainers of the pnp layer have asked that we not offer patches to it that make it understand VMBus, but that we rather find ways of using the code in its current state. So hv_vmbus.ko exports a function, vmbus_allocate_mmio() for choosing the address space for any child driver that needs this facility. The recently introduced PCI front-end driver for Hyper-V VMs (pci-hyperv.ko) uses vmbus_allocate_mmio() for choosing both the region of memory space into which real PCI Express devices are mapped. The regions allocated are made to look like root PCI bus bridge windows to the PCI driver, reusing all the code in the PCI driver for the rest of PCI device management. The problem is that these bridge windows are marked in such a way that devices can still allocate from the memory space spanned by them, and this means that if two different PCI buses are created in the VM, each with devices under them, they may allocate the same memory space, leading to PCI Base Address Register which overlap. This patch series fixes the problem by tracking allocations to child devices in a separate resource tree, marking them such that the bridge windows can't overlap. The main memory resource tree, iomem_resource, contains resources properly marked as bridge windows, allowing their children to overlap with them. Jake Oshins (7): drivers:hv: Lock access to hyperv_mmio resource tree drivers:hv: Make a function to free mmio regions through vmbus drivers:hv: Use new vmbus_mmio_free() from client drivers. drivers:hv: Reverse order of resources in hyperv_mmio drivers:hv: Track allocations of children of hv_vmbus in private resource tree drivers:hv: Record MMIO range in use by frame buffer drivers:hv: Separate out frame buffer logic when picking MMIO range drivers/hv/vmbus_drv.c | 142 +++++++++++++++++++++++++++++----------- drivers/pci/host/pci-hyperv.c | 14 ++-- drivers/video/fbdev/hyperv_fb.c | 4 +- include/linux/hyperv.h | 2 +- 4 files changed, 114 insertions(+), 48 deletions(-) -- 1.9.1