linux/virt/kvm/iommu.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2006, Intel Corporation.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  15 * Place - Suite 330, Boston, MA 02111-1307 USA.
  16 *
  17 * Copyright (C) 2006-2008 Intel Corporation
  18 * Copyright IBM Corporation, 2008
  19 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
  20 *
  21 * Author: Allen M. Kay <allen.m.kay@intel.com>
  22 * Author: Weidong Han <weidong.han@intel.com>
  23 * Author: Ben-Ami Yassour <benami@il.ibm.com>
  24 */
  25
  26#include <linux/list.h>
  27#include <linux/kvm_host.h>
  28#include <linux/module.h>
  29#include <linux/pci.h>
  30#include <linux/stat.h>
  31#include <linux/dmar.h>
  32#include <linux/iommu.h>
  33#include <linux/intel-iommu.h>
  34
  35static int allow_unsafe_assigned_interrupts;
  36module_param_named(allow_unsafe_assigned_interrupts,
  37                   allow_unsafe_assigned_interrupts, bool, S_IRUGO | S_IWUSR);
  38MODULE_PARM_DESC(allow_unsafe_assigned_interrupts,
  39 "Enable device assignment on platforms without interrupt remapping support.");
  40
  41static int kvm_iommu_unmap_memslots(struct kvm *kvm);
  42static void kvm_iommu_put_pages(struct kvm *kvm,
  43                                gfn_t base_gfn, unsigned long npages);
  44
  45static pfn_t kvm_pin_pages(struct kvm *kvm, struct kvm_memory_slot *slot,
  46                           gfn_t gfn, unsigned long size)
  47{
  48        gfn_t end_gfn;
  49        pfn_t pfn;
  50
  51        pfn     = gfn_to_pfn_memslot(kvm, slot, gfn);
  52        end_gfn = gfn + (size >> PAGE_SHIFT);
  53        gfn    += 1;
  54
  55        if (is_error_pfn(pfn))
  56                return pfn;
  57
  58        while (gfn < end_gfn)
  59                gfn_to_pfn_memslot(kvm, slot, gfn++);
  60
  61        return pfn;
  62}
  63
  64int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
  65{
  66        gfn_t gfn, end_gfn;
  67        pfn_t pfn;
  68        int r = 0;
  69        struct iommu_domain *domain = kvm->arch.iommu_domain;
  70        int flags;
  71
  72        /* check if iommu exists and in use */
  73        if (!domain)
  74                return 0;
  75
  76        gfn     = slot->base_gfn;
  77        end_gfn = gfn + slot->npages;
  78
  79        flags = IOMMU_READ | IOMMU_WRITE;
  80        if (kvm->arch.iommu_flags & KVM_IOMMU_CACHE_COHERENCY)
  81                flags |= IOMMU_CACHE;
  82
  83
  84        while (gfn < end_gfn) {
  85                unsigned long page_size;
  86
  87                /* Check if already mapped */
  88                if (iommu_iova_to_phys(domain, gfn_to_gpa(gfn))) {
  89                        gfn += 1;
  90                        continue;
  91                }
  92
  93                /* Get the page size we could use to map */
  94                page_size = kvm_host_page_size(kvm, gfn);
  95
  96                /* Make sure the page_size does not exceed the memslot */
  97                while ((gfn + (page_size >> PAGE_SHIFT)) > end_gfn)
  98                        page_size >>= 1;
  99
 100                /* Make sure gfn is aligned to the page size we want to map */
 101                while ((gfn << PAGE_SHIFT) & (page_size - 1))
 102                        page_size >>= 1;
 103
 104                /*
 105                 * Pin all pages we are about to map in memory. This is
 106                 * important because we unmap and unpin in 4kb steps later.
 107                 */
 108                pfn = kvm_pin_pages(kvm, slot, gfn, page_size);
 109                if (is_error_pfn(pfn)) {
 110                        gfn += 1;
 111                        continue;
 112                }
 113
 114                /* Map into IO address space */
 115                r = iommu_map(domain, gfn_to_gpa(gfn), pfn_to_hpa(pfn),
 116                              get_order(page_size), flags);
 117                if (r) {
 118                        printk(KERN_ERR "kvm_iommu_map_address:"
 119                               "iommu failed to map pfn=%llx\n", pfn);
 120                        goto unmap_pages;
 121                }
 122
 123                gfn += page_size >> PAGE_SHIFT;
 124
 125
 126        }
 127
 128        return 0;
 129
 130unmap_pages:
 131        kvm_iommu_put_pages(kvm, slot->base_gfn, gfn);
 132        return r;
 133}
 134
 135static int kvm_iommu_map_memslots(struct kvm *kvm)
 136{
 137        int i, idx, r = 0;
 138        struct kvm_memslots *slots;
 139
 140        idx = srcu_read_lock(&kvm->srcu);
 141        slots = kvm_memslots(kvm);
 142
 143        for (i = 0; i < slots->nmemslots; i++) {
 144                r = kvm_iommu_map_pages(kvm, &slots->memslots[i]);
 145                if (r)
 146                        break;
 147        }
 148        srcu_read_unlock(&kvm->srcu, idx);
 149
 150        return r;
 151}
 152
 153int kvm_assign_device(struct kvm *kvm,
 154                      struct kvm_assigned_dev_kernel *assigned_dev)
 155{
 156        struct pci_dev *pdev = NULL;
 157        struct iommu_domain *domain = kvm->arch.iommu_domain;
 158        int r, last_flags;
 159
 160        /* check if iommu exists and in use */
 161        if (!domain)
 162                return 0;
 163
 164        pdev = assigned_dev->dev;
 165        if (pdev == NULL)
 166                return -ENODEV;
 167
 168        r = iommu_attach_device(domain, &pdev->dev);
 169        if (r) {
 170                printk(KERN_ERR "assign device %x:%x:%x.%x failed",
 171                        pci_domain_nr(pdev->bus),
 172                        pdev->bus->number,
 173                        PCI_SLOT(pdev->devfn),
 174                        PCI_FUNC(pdev->devfn));
 175                return r;
 176        }
 177
 178        last_flags = kvm->arch.iommu_flags;
 179        if (iommu_domain_has_cap(kvm->arch.iommu_domain,
 180                                 IOMMU_CAP_CACHE_COHERENCY))
 181                kvm->arch.iommu_flags |= KVM_IOMMU_CACHE_COHERENCY;
 182
 183        /* Check if need to update IOMMU page table for guest memory */
 184        if ((last_flags ^ kvm->arch.iommu_flags) ==
 185                        KVM_IOMMU_CACHE_COHERENCY) {
 186                kvm_iommu_unmap_memslots(kvm);
 187                r = kvm_iommu_map_memslots(kvm);
 188                if (r)
 189                        goto out_unmap;
 190        }
 191
 192        pdev->dev_flags |= PCI_DEV_FLAGS_ASSIGNED;
 193
 194        printk(KERN_DEBUG "assign device %x:%x:%x.%x\n",
 195                assigned_dev->host_segnr,
 196                assigned_dev->host_busnr,
 197                PCI_SLOT(assigned_dev->host_devfn),
 198                PCI_FUNC(assigned_dev->host_devfn));
 199
 200        return 0;
 201out_unmap:
 202        kvm_iommu_unmap_memslots(kvm);
 203        return r;
 204}
 205
 206int kvm_deassign_device(struct kvm *kvm,
 207                        struct kvm_assigned_dev_kernel *assigned_dev)
 208{
 209        struct iommu_domain *domain = kvm->arch.iommu_domain;
 210        struct pci_dev *pdev = NULL;
 211
 212        /* check if iommu exists and in use */
 213        if (!domain)
 214                return 0;
 215
 216        pdev = assigned_dev->dev;
 217        if (pdev == NULL)
 218                return -ENODEV;
 219
 220        iommu_detach_device(domain, &pdev->dev);
 221
 222        pdev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED;
 223
 224        printk(KERN_DEBUG "deassign device %x:%x:%x.%x\n",
 225                assigned_dev->host_segnr,
 226                assigned_dev->host_busnr,
 227                PCI_SLOT(assigned_dev->host_devfn),
 228                PCI_FUNC(assigned_dev->host_devfn));
 229
 230        return 0;
 231}
 232
 233int kvm_iommu_map_guest(struct kvm *kvm)
 234{
 235        int r;
 236
 237        if (!iommu_present(&pci_bus_type)) {
 238                printk(KERN_ERR "%s: iommu not found\n", __func__);
 239                return -ENODEV;
 240        }
 241
 242        kvm->arch.iommu_domain = iommu_domain_alloc(&pci_bus_type);
 243        if (!kvm->arch.iommu_domain)
 244                return -ENOMEM;
 245
 246        if (!allow_unsafe_assigned_interrupts &&
 247            !iommu_domain_has_cap(kvm->arch.iommu_domain,
 248                                  IOMMU_CAP_INTR_REMAP)) {
 249                printk(KERN_WARNING "%s: No interrupt remapping support,"
 250                       " disallowing device assignment."
 251                       " Re-enble with \"allow_unsafe_assigned_interrupts=1\""
 252                       " module option.\n", __func__);
 253                iommu_domain_free(kvm->arch.iommu_domain);
 254                kvm->arch.iommu_domain = NULL;
 255                return -EPERM;
 256        }
 257
 258        r = kvm_iommu_map_memslots(kvm);
 259        if (r)
 260                goto out_unmap;
 261
 262        return 0;
 263
 264out_unmap:
 265        kvm_iommu_unmap_memslots(kvm);
 266        return r;
 267}
 268
 269static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages)
 270{
 271        unsigned long i;
 272
 273        for (i = 0; i < npages; ++i)
 274                kvm_release_pfn_clean(pfn + i);
 275}
 276
 277static void kvm_iommu_put_pages(struct kvm *kvm,
 278                                gfn_t base_gfn, unsigned long npages)
 279{
 280        struct iommu_domain *domain;
 281        gfn_t end_gfn, gfn;
 282        pfn_t pfn;
 283        u64 phys;
 284
 285        domain  = kvm->arch.iommu_domain;
 286        end_gfn = base_gfn + npages;
 287        gfn     = base_gfn;
 288
 289        /* check if iommu exists and in use */
 290        if (!domain)
 291                return;
 292
 293        while (gfn < end_gfn) {
 294                unsigned long unmap_pages;
 295                int order;
 296
 297                /* Get physical address */
 298                phys = iommu_iova_to_phys(domain, gfn_to_gpa(gfn));
 299                pfn  = phys >> PAGE_SHIFT;
 300
 301                /* Unmap address from IO address space */
 302                order       = iommu_unmap(domain, gfn_to_gpa(gfn), 0);
 303                unmap_pages = 1ULL << order;
 304
 305                /* Unpin all pages we just unmapped to not leak any memory */
 306                kvm_unpin_pages(kvm, pfn, unmap_pages);
 307
 308                gfn += unmap_pages;
 309        }
 310}
 311
 312static int kvm_iommu_unmap_memslots(struct kvm *kvm)
 313{
 314        int i, idx;
 315        struct kvm_memslots *slots;
 316
 317        idx = srcu_read_lock(&kvm->srcu);
 318        slots = kvm_memslots(kvm);
 319
 320        for (i = 0; i < slots->nmemslots; i++) {
 321                kvm_iommu_put_pages(kvm, slots->memslots[i].base_gfn,
 322                                    slots->memslots[i].npages);
 323        }
 324        srcu_read_unlock(&kvm->srcu, idx);
 325
 326        return 0;
 327}
 328
 329int kvm_iommu_unmap_guest(struct kvm *kvm)
 330{
 331        struct iommu_domain *domain = kvm->arch.iommu_domain;
 332
 333        /* check if iommu exists and in use */
 334        if (!domain)
 335                return 0;
 336
 337        kvm_iommu_unmap_memslots(kvm);
 338        iommu_domain_free(domain);
 339        return 0;
 340}
 341
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.