Commit 694ce18e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'stable/for-linus-fixes-3.3-rc3' of...

Merge tag 'stable/for-linus-fixes-3.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen

Two fixes for VCPU offlining; One to fix the string format exposed
by the xen-pci[front|back] to conform to the one used in majority of
PCI drivers; Two fixes to make the code more resilient to invalid
configurations.
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>

* tag 'stable/for-linus-fixes-3.3-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xenbus_dev: add missing error check to watch handling
  xen/pci[front|back]: Use %d instead of %1x for displaying PCI devfn.
  xen pvhvm: do not remap pirqs onto evtchns if !xen_have_vector_callback
  xen/smp: Fix CPU online/offline bug triggering a BUG: scheduling while atomic.
  xen/bootup: During bootup suppress XENBUS: Unable to read cpu state
parents 13d26193 a43a5ccd
...@@ -374,7 +374,7 @@ int __init pci_xen_init(void) ...@@ -374,7 +374,7 @@ int __init pci_xen_init(void)
int __init pci_xen_hvm_init(void) int __init pci_xen_hvm_init(void)
{ {
if (!xen_feature(XENFEAT_hvm_pirqs)) if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs))
return 0; return 0;
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
......
...@@ -409,6 +409,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */ ...@@ -409,6 +409,13 @@ static void __cpuinit xen_play_dead(void) /* used only with HOTPLUG_CPU */
play_dead_common(); play_dead_common();
HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL); HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL);
cpu_bringup(); cpu_bringup();
/*
* Balance out the preempt calls - as we are running in cpu_idle
* loop which has been called at bootup from cpu_bringup_and_idle.
* The cpucpu_bringup_and_idle called cpu_bringup which made a
* preempt_disable() So this preempt_enable will balance it out.
*/
preempt_enable();
} }
#else /* !CONFIG_HOTPLUG_CPU */ #else /* !CONFIG_HOTPLUG_CPU */
......
...@@ -189,7 +189,7 @@ static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn, ...@@ -189,7 +189,7 @@ static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn,
if (verbose_request) if (verbose_request)
dev_info(&pdev->xdev->dev, dev_info(&pdev->xdev->dev,
"read dev=%04x:%02x:%02x.%01x - offset %x size %d\n", "read dev=%04x:%02x:%02x.%d - offset %x size %d\n",
pci_domain_nr(bus), bus->number, PCI_SLOT(devfn), pci_domain_nr(bus), bus->number, PCI_SLOT(devfn),
PCI_FUNC(devfn), where, size); PCI_FUNC(devfn), where, size);
...@@ -228,7 +228,7 @@ static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn, ...@@ -228,7 +228,7 @@ static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn,
if (verbose_request) if (verbose_request)
dev_info(&pdev->xdev->dev, dev_info(&pdev->xdev->dev,
"write dev=%04x:%02x:%02x.%01x - " "write dev=%04x:%02x:%02x.%d - "
"offset %x size %d val %x\n", "offset %x size %d val %x\n",
pci_domain_nr(bus), bus->number, pci_domain_nr(bus), bus->number,
PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val); PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val);
...@@ -432,7 +432,7 @@ static int __devinit pcifront_scan_bus(struct pcifront_device *pdev, ...@@ -432,7 +432,7 @@ static int __devinit pcifront_scan_bus(struct pcifront_device *pdev,
d = pci_scan_single_device(b, devfn); d = pci_scan_single_device(b, devfn);
if (d) if (d)
dev_info(&pdev->xdev->dev, "New device on " dev_info(&pdev->xdev->dev, "New device on "
"%04x:%02x:%02x.%02x found.\n", domain, bus, "%04x:%02x:%02x.%d found.\n", domain, bus,
PCI_SLOT(devfn), PCI_FUNC(devfn)); PCI_SLOT(devfn), PCI_FUNC(devfn));
} }
...@@ -1041,7 +1041,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev) ...@@ -1041,7 +1041,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev)
pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func)); pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func));
if (!pci_dev) { if (!pci_dev) {
dev_dbg(&pdev->xdev->dev, dev_dbg(&pdev->xdev->dev,
"Cannot get PCI device %04x:%02x:%02x.%02x\n", "Cannot get PCI device %04x:%02x:%02x.%d\n",
domain, bus, slot, func); domain, bus, slot, func);
continue; continue;
} }
...@@ -1049,7 +1049,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev) ...@@ -1049,7 +1049,7 @@ static int pcifront_detach_devices(struct pcifront_device *pdev)
pci_dev_put(pci_dev); pci_dev_put(pci_dev);
dev_dbg(&pdev->xdev->dev, dev_dbg(&pdev->xdev->dev,
"PCI device %04x:%02x:%02x.%02x removed.\n", "PCI device %04x:%02x:%02x.%d removed.\n",
domain, bus, slot, func); domain, bus, slot, func);
} }
......
...@@ -30,7 +30,8 @@ static int vcpu_online(unsigned int cpu) ...@@ -30,7 +30,8 @@ static int vcpu_online(unsigned int cpu)
sprintf(dir, "cpu/%u", cpu); sprintf(dir, "cpu/%u", cpu);
err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state); err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state);
if (err != 1) { if (err != 1) {
printk(KERN_ERR "XENBUS: Unable to read cpu state\n"); if (!xen_initial_domain())
printk(KERN_ERR "XENBUS: Unable to read cpu state\n");
return err; return err;
} }
......
...@@ -884,7 +884,7 @@ static inline int str_to_quirk(const char *buf, int *domain, int *bus, int ...@@ -884,7 +884,7 @@ static inline int str_to_quirk(const char *buf, int *domain, int *bus, int
int err; int err;
err = err =
sscanf(buf, " %04x:%02x:%02x.%1x-%08x:%1x:%08x", domain, bus, slot, sscanf(buf, " %04x:%02x:%02x.%d-%08x:%1x:%08x", domain, bus, slot,
func, reg, size, mask); func, reg, size, mask);
if (err == 7) if (err == 7)
return 0; return 0;
...@@ -904,7 +904,7 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func) ...@@ -904,7 +904,7 @@ static int pcistub_device_id_add(int domain, int bus, int slot, int func)
pci_dev_id->bus = bus; pci_dev_id->bus = bus;
pci_dev_id->devfn = PCI_DEVFN(slot, func); pci_dev_id->devfn = PCI_DEVFN(slot, func);
pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%01x\n", pr_debug(DRV_NAME ": wants to seize %04x:%02x:%02x.%d\n",
domain, bus, slot, func); domain, bus, slot, func);
spin_lock_irqsave(&device_ids_lock, flags); spin_lock_irqsave(&device_ids_lock, flags);
...@@ -934,7 +934,7 @@ static int pcistub_device_id_remove(int domain, int bus, int slot, int func) ...@@ -934,7 +934,7 @@ static int pcistub_device_id_remove(int domain, int bus, int slot, int func)
err = 0; err = 0;
pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%01x from " pr_debug(DRV_NAME ": removed %04x:%02x:%02x.%d from "
"seize list\n", domain, bus, slot, func); "seize list\n", domain, bus, slot, func);
} }
} }
...@@ -1029,7 +1029,7 @@ static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf) ...@@ -1029,7 +1029,7 @@ static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf)
break; break;
count += scnprintf(buf + count, PAGE_SIZE - count, count += scnprintf(buf + count, PAGE_SIZE - count,
"%04x:%02x:%02x.%01x\n", "%04x:%02x:%02x.%d\n",
pci_dev_id->domain, pci_dev_id->bus, pci_dev_id->domain, pci_dev_id->bus,
PCI_SLOT(pci_dev_id->devfn), PCI_SLOT(pci_dev_id->devfn),
PCI_FUNC(pci_dev_id->devfn)); PCI_FUNC(pci_dev_id->devfn));
......
...@@ -206,6 +206,7 @@ static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev, ...@@ -206,6 +206,7 @@ static int xen_pcibk_publish_pci_dev(struct xen_pcibk_device *pdev,
goto out; goto out;
} }
/* Note: The PV protocol uses %02x, don't change it */
err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str, err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
"%04x:%02x:%02x.%02x", domain, bus, "%04x:%02x:%02x.%02x", domain, bus,
PCI_SLOT(devfn), PCI_FUNC(devfn)); PCI_SLOT(devfn), PCI_FUNC(devfn));
...@@ -229,7 +230,7 @@ static int xen_pcibk_export_device(struct xen_pcibk_device *pdev, ...@@ -229,7 +230,7 @@ static int xen_pcibk_export_device(struct xen_pcibk_device *pdev,
err = -EINVAL; err = -EINVAL;
xenbus_dev_fatal(pdev->xdev, err, xenbus_dev_fatal(pdev->xdev, err,
"Couldn't locate PCI device " "Couldn't locate PCI device "
"(%04x:%02x:%02x.%01x)! " "(%04x:%02x:%02x.%d)! "
"perhaps already in-use?", "perhaps already in-use?",
domain, bus, slot, func); domain, bus, slot, func);
goto out; goto out;
...@@ -274,7 +275,7 @@ static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev, ...@@ -274,7 +275,7 @@ static int xen_pcibk_remove_device(struct xen_pcibk_device *pdev,
if (!dev) { if (!dev) {
err = -EINVAL; err = -EINVAL;
dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device " dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device "
"(%04x:%02x:%02x.%01x)! not owned by this domain\n", "(%04x:%02x:%02x.%d)! not owned by this domain\n",
domain, bus, slot, func); domain, bus, slot, func);
goto out; goto out;
} }
......
...@@ -369,6 +369,10 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) ...@@ -369,6 +369,10 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u)
goto out; goto out;
} }
token++; token++;
if (memchr(token, 0, u->u.msg.len - (token - path)) == NULL) {
rc = -EILSEQ;
goto out;
}
if (msg_type == XS_WATCH) { if (msg_type == XS_WATCH) {
watch = alloc_watch_adapter(path, token); watch = alloc_watch_adapter(path, token);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment