On Wed, Sep 18, 2013 at 03:09:01PM +0900, Takao Indoh wrote:
> +     /*
> +      *  In the case of kdump, ioremap is needed because root-entry table
> +      *  exists in first kernel's memory area which is not mapped in second
> +      *  kernel
> +      */
> +     root = (struct root_entry *)ioremap(addr, PAGE_SIZE);
> +     if (!root)
> +             return;
> +
> +     for (bus = 0; bus < ROOT_ENTRY_NR; bus++) {
> +             if (!root_present(&root[bus]))
> +                     continue;
> +
> +             context = (struct context_entry *)ioremap(
> +                     root[bus].val & VTD_PAGE_MASK, PAGE_SIZE);
> +             if (!context)
> +                     continue;
> +
> +             for (devfn = 0; devfn < CONTEXT_ENTRY_NR; devfn++) {
> +                     if (!context_present(&context[devfn]))
> +                             continue;
> +
> +                     dev = pci_get_domain_bus_and_slot(segment, bus, devfn);
> +                     if (!dev)
> +                             continue;
> +
> +                     if (!pci_reset_bus(dev->bus)) /* go to next bus */
> +                             break;
> +                     else /* Try per-function reset */
> +                             pci_reset_function(dev);
> +
> +             }
> +             iounmap(context);
> +     }
> +     iounmap(root);

I am not convinced that this is the right approach. If a device wasn't
translated by VT-d in the old kernel doesn't mean it will not be
translated in the new kernel. How about unconditionally resetting all
PCI busses and/or functions here before IOMMU initialization proceeds?


        Joerg


_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to