Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f66d95d6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'stable/for-linus-3.11-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull Xen fixes from Konrad Rzeszutek Wilk:
 - Three fixes for ARM/ARM64 to either compile or not certain generic
   drivers
 - Fix for avoiding a potential deadlock when an user space event
   channel is destroyed.
 - Fix a workqueue resuming multiple times.

* tag 'stable/for-linus-3.11-rc3-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/tmem: do not allow XEN_TMEM on ARM64
  xen/evtchn: avoid a deadlock when unbinding an event channel
  xen/arm: enable PV control for ARM
  xen/arm64: Don't compile cpu hotplug
  xenbus: frontend resume cleanup
parents 878d2cd6 741ddbcf
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ config SWIOTLB_XEN

config XEN_TMEM
	tristate
	depends on !ARM
	depends on !ARM && !ARM64
	default m if (CLEANCACHE || FRONTSWAP)
	help
	  Shim to interface in-kernel Transcendent Memory hooks
+2 −3
Original line number Diff line number Diff line
ifneq ($(CONFIG_ARM),y)
obj-y	+= manage.o
ifeq ($(filter y, $(CONFIG_ARM) $(CONFIG_ARM64)),)
obj-$(CONFIG_HOTPLUG_CPU)		+= cpu_hotplug.o
endif
obj-$(CONFIG_X86)			+= fallback.o
obj-y	+= grant-table.o features.o events.o balloon.o
obj-y	+= grant-table.o features.o events.o balloon.o manage.o
obj-y	+= xenbus/

nostackp := $(call cc-option, -fno-stack-protector)
+2 −19
Original line number Diff line number Diff line
@@ -379,18 +379,12 @@ static long evtchn_ioctl(struct file *file,
		if (unbind.port >= NR_EVENT_CHANNELS)
			break;

		spin_lock_irq(&port_user_lock);

		rc = -ENOTCONN;
		if (get_port_user(unbind.port) != u) {
			spin_unlock_irq(&port_user_lock);
		if (get_port_user(unbind.port) != u)
			break;
		}

		disable_irq(irq_from_evtchn(unbind.port));

		spin_unlock_irq(&port_user_lock);

		evtchn_unbind_from_user(u, unbind.port);

		rc = 0;
@@ -490,26 +484,15 @@ static int evtchn_release(struct inode *inode, struct file *filp)
	int i;
	struct per_user_data *u = filp->private_data;

	spin_lock_irq(&port_user_lock);

	free_page((unsigned long)u->ring);

	for (i = 0; i < NR_EVENT_CHANNELS; i++) {
		if (get_port_user(i) != u)
			continue;

		disable_irq(irq_from_evtchn(i));
	}

	spin_unlock_irq(&port_user_lock);

	for (i = 0; i < NR_EVENT_CHANNELS; i++) {
		if (get_port_user(i) != u)
			continue;

		evtchn_unbind_from_user(get_port_user(i), i);
	}

	free_page((unsigned long)u->ring);
	kfree(u->name);
	kfree(u);

+16 −3
Original line number Diff line number Diff line
@@ -115,7 +115,6 @@ static int xenbus_frontend_dev_resume(struct device *dev)
			return -EFAULT;
		}

		INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume);
		queue_work(xenbus_frontend_wq, &xdev->work);

		return 0;
@@ -124,6 +123,16 @@ static int xenbus_frontend_dev_resume(struct device *dev)
	return xenbus_dev_resume(dev);
}

static int xenbus_frontend_dev_probe(struct device *dev)
{
	if (xen_store_domain_type == XS_LOCAL) {
		struct xenbus_device *xdev = to_xenbus_device(dev);
		INIT_WORK(&xdev->work, xenbus_frontend_delayed_resume);
	}

	return xenbus_dev_probe(dev);
}

static const struct dev_pm_ops xenbus_pm_ops = {
	.suspend	= xenbus_dev_suspend,
	.resume		= xenbus_frontend_dev_resume,
@@ -142,7 +151,7 @@ static struct xen_bus_type xenbus_frontend = {
		.name		= "xen",
		.match		= xenbus_match,
		.uevent		= xenbus_uevent_frontend,
		.probe		= xenbus_dev_probe,
		.probe		= xenbus_frontend_dev_probe,
		.remove		= xenbus_dev_remove,
		.shutdown	= xenbus_dev_shutdown,
		.dev_attrs	= xenbus_dev_attrs,
@@ -474,7 +483,11 @@ static int __init xenbus_probe_frontend_init(void)

	register_xenstore_notifier(&xenstore_notifier);

	if (xen_store_domain_type == XS_LOCAL) {
		xenbus_frontend_wq = create_workqueue("xenbus_frontend");
		if (!xenbus_frontend_wq)
			pr_warn("create xenbus frontend workqueue failed, S3 resume is likely to fail\n");
	}

	return 0;
}