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

Commit 6b476e11 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-4.2-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen bug fixes from David Vrabel:

 - revert a fix from 4.2-rc5 that was causing lots of WARNING spam.

 - fix a memory leak affecting backends in HVM guests.

 - fix PV domU hang with certain configurations.

* tag 'for-linus-4.2-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/xenbus: Don't leak memory when unmapping the ring on HVM backend
  Revert "xen/events/fifo: Handle linked events when closing a port"
  x86/xen: build "Xen PV" APIC driver for domU as well
parents ed596cde c22fe519
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -13,13 +13,13 @@ CFLAGS_mmu.o := $(nostackp)
obj-y		:= enlighten.o setup.o multicalls.o mmu.o irq.o \
			time.o xen-asm.o xen-asm_$(BITS).o \
			grant-table.o suspend.o platform-pci-unplug.o \
			p2m.o
			p2m.o apic.o

obj-$(CONFIG_EVENT_TRACING) += trace.o

obj-$(CONFIG_SMP)		+= smp.o
obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o
obj-$(CONFIG_XEN_DEBUG_FS)	+= debugfs.o
obj-$(CONFIG_XEN_DOM0)		+= apic.o vga.o
obj-$(CONFIG_XEN_DOM0)		+= vga.o
obj-$(CONFIG_SWIOTLB_XEN)	+= pci-swiotlb-xen.o
obj-$(CONFIG_XEN_EFI)		+= efi.o
+2 −4
Original line number Diff line number Diff line
@@ -101,17 +101,15 @@ struct dom0_vga_console_info;

#ifdef CONFIG_XEN_DOM0
void __init xen_init_vga(const struct dom0_vga_console_info *, size_t size);
void __init xen_init_apic(void);
#else
static inline void __init xen_init_vga(const struct dom0_vga_console_info *info,
				       size_t size)
{
}
static inline void __init xen_init_apic(void)
{
}
#endif

void __init xen_init_apic(void);

#ifdef CONFIG_XEN_EFI
extern void xen_efi_init(void);
#else
+4 −6
Original line number Diff line number Diff line
@@ -452,12 +452,10 @@ static void xen_free_irq(unsigned irq)
	irq_free_desc(irq);
}

static void xen_evtchn_close(unsigned int port, unsigned int cpu)
static void xen_evtchn_close(unsigned int port)
{
	struct evtchn_close close;

	xen_evtchn_op_close(port, cpu);

	close.port = port;
	if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
		BUG();
@@ -546,7 +544,7 @@ static unsigned int __startup_pirq(unsigned int irq)

err:
	pr_err("irq%d: Failed to set port to irq mapping (%d)\n", irq, rc);
	xen_evtchn_close(evtchn, NR_CPUS);
	xen_evtchn_close(evtchn);
	return 0;
}

@@ -567,7 +565,7 @@ static void shutdown_pirq(struct irq_data *data)
		return;

	mask_evtchn(evtchn);
	xen_evtchn_close(evtchn, cpu_from_evtchn(evtchn));
	xen_evtchn_close(evtchn);
	xen_irq_info_cleanup(info);
}

@@ -611,7 +609,7 @@ static void __unbind_from_irq(unsigned int irq)
	if (VALID_EVTCHN(evtchn)) {
		unsigned int cpu = cpu_from_irq(irq);

		xen_evtchn_close(evtchn, cpu);
		xen_evtchn_close(evtchn);

		switch (type_from_irq(irq)) {
		case IRQT_VIRQ:
+5 −40
Original line number Diff line number Diff line
@@ -255,12 +255,6 @@ static void evtchn_fifo_unmask(unsigned port)
	}
}

static bool evtchn_fifo_is_linked(unsigned port)
{
	event_word_t *word = event_word_from_port(port);
	return sync_test_bit(EVTCHN_FIFO_BIT(LINKED, word), BM(word));
}

static uint32_t clear_linked(volatile event_word_t *word)
{
	event_word_t new, old, w;
@@ -287,8 +281,7 @@ static void handle_irq_for_port(unsigned port)

static void consume_one_event(unsigned cpu,
			      struct evtchn_fifo_control_block *control_block,
			      unsigned priority, unsigned long *ready,
			      bool drop)
			      unsigned priority, unsigned long *ready)
{
	struct evtchn_fifo_queue *q = &per_cpu(cpu_queue, cpu);
	uint32_t head;
@@ -320,15 +313,13 @@ static void consume_one_event(unsigned cpu,
	if (head == 0)
		clear_bit(priority, ready);

	if (evtchn_fifo_is_pending(port) && !evtchn_fifo_is_masked(port)) {
		if (likely(!drop))
	if (evtchn_fifo_is_pending(port) && !evtchn_fifo_is_masked(port))
		handle_irq_for_port(port);
	}

	q->head[priority] = head;
}

static void __evtchn_fifo_handle_events(unsigned cpu, bool drop)
static void evtchn_fifo_handle_events(unsigned cpu)
{
	struct evtchn_fifo_control_block *control_block;
	unsigned long ready;
@@ -340,16 +331,11 @@ static void __evtchn_fifo_handle_events(unsigned cpu, bool drop)

	while (ready) {
		q = find_first_bit(&ready, EVTCHN_FIFO_MAX_QUEUES);
		consume_one_event(cpu, control_block, q, &ready, drop);
		consume_one_event(cpu, control_block, q, &ready);
		ready |= xchg(&control_block->ready, 0);
	}
}

static void evtchn_fifo_handle_events(unsigned cpu)
{
	__evtchn_fifo_handle_events(cpu, false);
}

static void evtchn_fifo_resume(void)
{
	unsigned cpu;
@@ -385,26 +371,6 @@ static void evtchn_fifo_resume(void)
	event_array_pages = 0;
}

static void evtchn_fifo_close(unsigned port, unsigned int cpu)
{
	if (cpu == NR_CPUS)
		return;

	get_online_cpus();
	if (cpu_online(cpu)) {
		if (WARN_ON(irqs_disabled()))
			goto out;

		while (evtchn_fifo_is_linked(port))
			cpu_relax();
	} else {
		__evtchn_fifo_handle_events(cpu, true);
	}

out:
	put_online_cpus();
}

static const struct evtchn_ops evtchn_ops_fifo = {
	.max_channels      = evtchn_fifo_max_channels,
	.nr_channels       = evtchn_fifo_nr_channels,
@@ -418,7 +384,6 @@ static const struct evtchn_ops evtchn_ops_fifo = {
	.unmask            = evtchn_fifo_unmask,
	.handle_events     = evtchn_fifo_handle_events,
	.resume            = evtchn_fifo_resume,
	.close             = evtchn_fifo_close,
};

static int evtchn_fifo_alloc_control_block(unsigned cpu)
+0 −7
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ struct evtchn_ops {
	bool (*test_and_set_mask)(unsigned port);
	void (*mask)(unsigned port);
	void (*unmask)(unsigned port);
	void (*close)(unsigned port, unsigned cpu);

	void (*handle_events)(unsigned cpu);
	void (*resume)(void);
@@ -146,12 +145,6 @@ static inline void xen_evtchn_resume(void)
		evtchn_ops->resume();
}

static inline void xen_evtchn_op_close(unsigned port, unsigned cpu)
{
	if (evtchn_ops->close)
		return evtchn_ops->close(port, cpu);
}

void xen_evtchn_2l_init(void);
int xen_evtchn_fifo_init(void);

Loading