mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
xen: features and fixes for 3.16-rc0
- Support foreign mappings in PVH domains (needed when dom0 is PVH)
- Fix mapping high MMIO regions in x86 PV guests (this is also the
first half of removing the PAGE_IOMAP PTE flag).
- ARM suspend/resume support.
- ARM multicall support.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.12 (GNU/Linux)
iQEcBAABAgAGBQJTjE5MAAoJEFxbo/MsZsTRtl8H/2lfS9w05e60vRxjolPV0vRc
5k9DcYFeJ+k2cz/2T3mNlIvKdfBTesSfgVquH+28GhQz+uKFQ1OrJpYNDTougSw5
Wv0Ae8e+7eLABvJ9XMiZdDsPzsICw2wqWOvqrnQi2qR3SIimBc5tBigR4+Rccv+e
btuBLlYT4WPQ8qgNyCBPgxzuyxteu5wK/0XryX6NcbrxeEbAzQAeDKkmvCD4fSvx
KxrwTO3mwV4Lefmf/WS4Z9fDcPujQOUqKEtUWanw/2JalO1BzDPo+1wvYs0LduLC
QI/YJN4SL3UeGOmbX2tyIaRgMsAcQVVrYkTm1cp8eD7vcRuvXaqy6dxuX05+V4g=
=cxfG
-----END PGP SIGNATURE-----
Merge tag 'stable/for-linus-3.16-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip into next
Pull Xen updates from David Vrabel:
"xen: features and fixes for 3.16-rc0
- support foreign mappings in PVH domains (needed when dom0 is PVH)
- fix mapping high MMIO regions in x86 PV guests (this is also the
first half of removing the PAGE_IOMAP PTE flag).
- ARM suspend/resume support.
- ARM multicall support"
* tag 'stable/for-linus-3.16-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
x86/xen: map foreign pfns for autotranslated guests
xen-acpi-processor: Don't display errors when we get -ENOSYS
xen/pciback: Document the entry points for 'pcistub_put_pci_dev'
xen/pciback: Document when the 'unbind' and 'bind' functions are called.
xen-pciback: Document when we FLR an PCI device.
xen-pciback: First reset, then free.
xen-pciback: Cleanup up pcistub_put_pci_dev
x86/xen: do not use _PAGE_IOMAP in xen_remap_domain_mfn_range()
x86/xen: set regions above the end of RAM as 1:1
x86/xen: only warn once if bad MFNs are found during setup
x86/xen: compactly store large identity ranges in the p2m
x86/xen: fix set_phys_range_identity() if pfn_e > MAX_P2M_PFN
x86/xen: rename early_p2m_alloc() and early_p2m_alloc_middle()
xen/x86: set panic notifier priority to minimum
arm,arm64/xen: introduce HYPERVISOR_suspend()
xen: refactor suspend pre/post hooks
arm: xen: export HYPERVISOR_multicall to modules.
arm64: introduce virt_to_pfn
arm/xen: Remove definiition of virt_to_pfn in asm/xen/page.h
arm: xen: implement multicall hypercall support.
This commit is contained in:
commit
9f888b3a10
19 changed files with 334 additions and 128 deletions
|
|
@ -41,9 +41,6 @@ static enum shutdown_state shutting_down = SHUTDOWN_INVALID;
|
|||
|
||||
struct suspend_info {
|
||||
int cancelled;
|
||||
unsigned long arg; /* extra hypercall argument */
|
||||
void (*pre)(void);
|
||||
void (*post)(int cancelled);
|
||||
};
|
||||
|
||||
static RAW_NOTIFIER_HEAD(xen_resume_notifier);
|
||||
|
|
@ -61,26 +58,6 @@ void xen_resume_notifier_unregister(struct notifier_block *nb)
|
|||
EXPORT_SYMBOL_GPL(xen_resume_notifier_unregister);
|
||||
|
||||
#ifdef CONFIG_HIBERNATE_CALLBACKS
|
||||
static void xen_hvm_post_suspend(int cancelled)
|
||||
{
|
||||
xen_arch_hvm_post_suspend(cancelled);
|
||||
gnttab_resume();
|
||||
}
|
||||
|
||||
static void xen_pre_suspend(void)
|
||||
{
|
||||
xen_mm_pin_all();
|
||||
gnttab_suspend();
|
||||
xen_arch_pre_suspend();
|
||||
}
|
||||
|
||||
static void xen_post_suspend(int cancelled)
|
||||
{
|
||||
xen_arch_post_suspend(cancelled);
|
||||
gnttab_resume();
|
||||
xen_mm_unpin_all();
|
||||
}
|
||||
|
||||
static int xen_suspend(void *data)
|
||||
{
|
||||
struct suspend_info *si = data;
|
||||
|
|
@ -94,18 +71,20 @@ static int xen_suspend(void *data)
|
|||
return err;
|
||||
}
|
||||
|
||||
if (si->pre)
|
||||
si->pre();
|
||||
gnttab_suspend();
|
||||
xen_arch_pre_suspend();
|
||||
|
||||
/*
|
||||
* This hypercall returns 1 if suspend was cancelled
|
||||
* or the domain was merely checkpointed, and 0 if it
|
||||
* is resuming in a new domain.
|
||||
*/
|
||||
si->cancelled = HYPERVISOR_suspend(si->arg);
|
||||
si->cancelled = HYPERVISOR_suspend(xen_pv_domain()
|
||||
? virt_to_mfn(xen_start_info)
|
||||
: 0);
|
||||
|
||||
if (si->post)
|
||||
si->post(si->cancelled);
|
||||
xen_arch_post_suspend(si->cancelled);
|
||||
gnttab_resume();
|
||||
|
||||
if (!si->cancelled) {
|
||||
xen_irq_resume();
|
||||
|
|
@ -154,16 +133,6 @@ static void do_suspend(void)
|
|||
|
||||
si.cancelled = 1;
|
||||
|
||||
if (xen_hvm_domain()) {
|
||||
si.arg = 0UL;
|
||||
si.pre = NULL;
|
||||
si.post = &xen_hvm_post_suspend;
|
||||
} else {
|
||||
si.arg = virt_to_mfn(xen_start_info);
|
||||
si.pre = &xen_pre_suspend;
|
||||
si.post = &xen_post_suspend;
|
||||
}
|
||||
|
||||
err = stop_machine(xen_suspend, &si, cpumask_of(0));
|
||||
|
||||
raw_notifier_call_chain(&xen_resume_notifier, 0, NULL);
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ static int push_cxx_to_hypervisor(struct acpi_processor *_pr)
|
|||
pr_debug(" C%d: %s %d uS\n",
|
||||
cx->type, cx->desc, (u32)cx->latency);
|
||||
}
|
||||
} else if (ret != -EINVAL)
|
||||
} else if ((ret != -EINVAL) && (ret != -ENOSYS))
|
||||
/* EINVAL means the ACPI ID is incorrect - meaning the ACPI
|
||||
* table is referencing a non-existing CPU - which can happen
|
||||
* with broken ACPI tables. */
|
||||
|
|
@ -259,7 +259,7 @@ static int push_pxx_to_hypervisor(struct acpi_processor *_pr)
|
|||
(u32) perf->states[i].power,
|
||||
(u32) perf->states[i].transition_latency);
|
||||
}
|
||||
} else if (ret != -EINVAL)
|
||||
} else if ((ret != -EINVAL) && (ret != -ENOSYS))
|
||||
/* EINVAL means the ACPI ID is incorrect - meaning the ACPI
|
||||
* table is referencing a non-existing CPU - which can happen
|
||||
* with broken ACPI tables. */
|
||||
|
|
|
|||
|
|
@ -242,6 +242,15 @@ struct pci_dev *pcistub_get_pci_dev(struct xen_pcibk_device *pdev,
|
|||
return found_dev;
|
||||
}
|
||||
|
||||
/*
|
||||
* Called when:
|
||||
* - XenBus state has been reconfigure (pci unplug). See xen_pcibk_remove_device
|
||||
* - XenBus state has been disconnected (guest shutdown). See xen_pcibk_xenbus_remove
|
||||
* - 'echo BDF > unbind' on pciback module with no guest attached. See pcistub_remove
|
||||
* - 'echo BDF > unbind' with a guest still using it. See pcistub_remove
|
||||
*
|
||||
* As such we have to be careful.
|
||||
*/
|
||||
void pcistub_put_pci_dev(struct pci_dev *dev)
|
||||
{
|
||||
struct pcistub_device *psdev, *found_psdev = NULL;
|
||||
|
|
@ -272,16 +281,16 @@ void pcistub_put_pci_dev(struct pci_dev *dev)
|
|||
* and want to inhibit the user from fiddling with 'reset'
|
||||
*/
|
||||
pci_reset_function(dev);
|
||||
pci_restore_state(psdev->dev);
|
||||
pci_restore_state(dev);
|
||||
|
||||
/* This disables the device. */
|
||||
xen_pcibk_reset_device(found_psdev->dev);
|
||||
xen_pcibk_reset_device(dev);
|
||||
|
||||
/* And cleanup up our emulated fields. */
|
||||
xen_pcibk_config_free_dyn_fields(found_psdev->dev);
|
||||
xen_pcibk_config_reset_dev(found_psdev->dev);
|
||||
xen_pcibk_config_reset_dev(dev);
|
||||
xen_pcibk_config_free_dyn_fields(dev);
|
||||
|
||||
xen_unregister_device_domain_owner(found_psdev->dev);
|
||||
xen_unregister_device_domain_owner(dev);
|
||||
|
||||
spin_lock_irqsave(&found_psdev->lock, flags);
|
||||
found_psdev->pdev = NULL;
|
||||
|
|
@ -493,6 +502,8 @@ static int pcistub_seize(struct pci_dev *dev)
|
|||
return err;
|
||||
}
|
||||
|
||||
/* Called when 'bind'. This means we must _NOT_ call pci_reset_function or
|
||||
* other functions that take the sysfs lock. */
|
||||
static int pcistub_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
{
|
||||
int err = 0;
|
||||
|
|
@ -520,6 +531,8 @@ out:
|
|||
return err;
|
||||
}
|
||||
|
||||
/* Called when 'unbind'. This means we must _NOT_ call pci_reset_function or
|
||||
* other functions that take the sysfs lock. */
|
||||
static void pcistub_remove(struct pci_dev *dev)
|
||||
{
|
||||
struct pcistub_device *psdev, *found_psdev = NULL;
|
||||
|
|
@ -551,6 +564,8 @@ static void pcistub_remove(struct pci_dev *dev)
|
|||
pr_warn("****** shutdown driver domain before binding device\n");
|
||||
pr_warn("****** to other drivers or domains\n");
|
||||
|
||||
/* N.B. This ends up calling pcistub_put_pci_dev which ends up
|
||||
* doing the FLR. */
|
||||
xen_pcibk_release_pci_dev(found_psdev->pdev,
|
||||
found_psdev->dev);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ static void free_pdev(struct xen_pcibk_device *pdev)
|
|||
|
||||
xen_pcibk_disconnect(pdev);
|
||||
|
||||
/* N.B. This calls pcistub_put_pci_dev which does the FLR on all
|
||||
* of the PCIe devices. */
|
||||
xen_pcibk_release_devices(pdev);
|
||||
|
||||
dev_set_drvdata(&pdev->xdev->dev, NULL);
|
||||
|
|
@ -286,6 +288,8 @@ static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev,
|
|||
dev_dbg(&dev->dev, "unregistering for %d\n", pdev->xdev->otherend_id);
|
||||
xen_unregister_device_domain_owner(dev);
|
||||
|
||||
/* N.B. This ends up calling pcistub_put_pci_dev which ends up
|
||||
* doing the FLR. */
|
||||
xen_pcibk_release_pci_dev(pdev, dev);
|
||||
|
||||
out:
|
||||
|
|
|
|||
Loading…
Reference in a new issue