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

Commit 33b65f1e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'stable/for-linus-3.9-rc4-tag' of...

Merge tag 'stable/for-linus-3.9-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen

Pull Xen bug-fixes from Konrad Rzeszutek Wilk:
 "This is mostly just the last stragglers of the regression bugs that
  this merge window had.  There are also two bug-fixes: one that adds an
  extra layer of security, and a regression fix for a change that was
  added in v3.7 (the v1 was faulty, the v2 works).

   - Regression fixes for C-and-P states not being parsed properly.
   - Fix possible security issue with guests triggering DoS via
     non-assigned MSI-Xs.
   - Fix regression (introduced in v3.7) with raising an event (v2).
   - Fix hastily introduced band-aid during c0 for the CR3 blowup."

* tag 'stable/for-linus-3.9-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xen/events: avoid race with raising an event in unmask_evtchn()
  xen/mmu: Move the setting of pvops.write_cr3 to later phase in bootup.
  xen/acpi-stub: Disable it b/c the acpi_processor_add is no longer called.
  xen-pciback: notify hypervisor about devices intended to be assigned to guests
  xen/acpi-processor: Don't dereference struct acpi_processor on all CPUs.
parents f8966048 c26377e6
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -382,14 +382,14 @@ HYPERVISOR_console_io(int cmd, int count, char *str)
	return _hypercall3(int, console_io, cmd, count, str);
}

extern int __must_check HYPERVISOR_physdev_op_compat(int, void *);
extern int __must_check xen_physdev_op_compat(int, void *);

static inline int
HYPERVISOR_physdev_op(int cmd, void *arg)
{
	int rc = _hypercall2(int, physdev_op, cmd, arg);
	if (unlikely(rc == -ENOSYS))
		rc = HYPERVISOR_physdev_op_compat(cmd, arg);
		rc = xen_physdev_op_compat(cmd, arg);
	return rc;
}

+1 −2
Original line number Diff line number Diff line
@@ -1467,8 +1467,6 @@ static void __init xen_write_cr3_init(unsigned long cr3)
	__xen_write_cr3(true, cr3);

	xen_mc_issue(PARAVIRT_LAZY_CPU);  /* interrupts restored */

	pv_mmu_ops.write_cr3 = &xen_write_cr3;
}
#endif

@@ -2122,6 +2120,7 @@ static void __init xen_post_allocator_init(void)
#endif

#ifdef CONFIG_X86_64
	pv_mmu_ops.write_cr3 = &xen_write_cr3;
	SetPagePinned(virt_to_page(level3_user_vsyscall));
#endif
	xen_mark_init_mm_pinned();
+1 −1
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ config XEN_PRIVCMD

config XEN_STUB
	bool "Xen stub drivers"
	depends on XEN && X86_64
	depends on XEN && X86_64 && BROKEN
	default n
	help
	  Allow kernel to install stub drivers, to reserve space for Xen drivers,
+15 −5
Original line number Diff line number Diff line
@@ -403,11 +403,23 @@ static void unmask_evtchn(int port)

	if (unlikely((cpu != cpu_from_evtchn(port))))
		do_hypercall = 1;
	else
	else {
		/*
		 * Need to clear the mask before checking pending to
		 * avoid a race with an event becoming pending.
		 *
		 * EVTCHNOP_unmask will only trigger an upcall if the
		 * mask bit was set, so if a hypercall is needed
		 * remask the event.
		 */
		sync_clear_bit(port, BM(&s->evtchn_mask[0]));
		evtchn_pending = sync_test_bit(port, BM(&s->evtchn_pending[0]));

	if (unlikely(evtchn_pending && xen_hvm_domain()))
		if (unlikely(evtchn_pending && xen_hvm_domain())) {
			sync_set_bit(port, BM(&s->evtchn_mask[0]));
			do_hypercall = 1;
		}
	}

	/* Slow path (hypercall) if this is a non-local port or if this is
	 * an hvm domain and an event is pending (hvm domains don't have
@@ -418,8 +430,6 @@ static void unmask_evtchn(int port)
	} else {
		struct vcpu_info *vcpu_info = __this_cpu_read(xen_vcpu);

		sync_clear_bit(port, BM(&s->evtchn_mask[0]));

		/*
		 * The following is basically the equivalent of
		 * 'hw_resend_irq'. Just like a real IO-APIC we 'lose
+2 −1
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ int xen_event_channel_op_compat(int cmd, void *arg)
}
EXPORT_SYMBOL_GPL(xen_event_channel_op_compat);

int HYPERVISOR_physdev_op_compat(int cmd, void *arg)
int xen_physdev_op_compat(int cmd, void *arg)
{
	struct physdev_op op;
	int rc;
@@ -78,3 +78,4 @@ int HYPERVISOR_physdev_op_compat(int cmd, void *arg)

	return rc;
}
EXPORT_SYMBOL_GPL(xen_physdev_op_compat);
Loading