Commit 9530d50c authored by jan.koester's avatar jan.koester
Browse files

some fixes

parent f747500b
Loading
Loading
Loading
Loading
+24 −44
Original line number Diff line number Diff line
@@ -248,15 +248,6 @@ static int set_evtchn_to_irq(evtchn_port_t evtchn, unsigned int irq)
	return 0;
}

int get_evtchn_to_irq(evtchn_port_t evtchn)
{
	if (evtchn >= xen_evtchn_max_channels())
		return -1;
	if (evtchn_to_irq[EVTCHN_ROW(evtchn)] == NULL)
		return -1;
	return READ_ONCE(evtchn_to_irq[EVTCHN_ROW(evtchn)][EVTCHN_COL(evtchn)]);
}

/* Get info for IRQ */
static struct irq_info *info_for_irq(unsigned irq)
{
@@ -373,50 +364,37 @@ static int xen_irq_info_evtchn_setup(struct irq_info *info,
	return ret;
}

static int xen_irq_info_ipi_setup(unsigned cpu,
				  unsigned irq,
				  evtchn_port_t evtchn,
				  enum ipi_vector ipi)
static int xen_irq_info_ipi_setup(struct irq_info *info, unsigned int cpu,
				  evtchn_port_t evtchn, enum ipi_vector ipi)
{
	struct irq_info *info = info_for_irq(irq);

	info->u.ipi = ipi;

	per_cpu(ipi_to_irq, cpu)[ipi] = irq;
	per_cpu(ipi_to_irq, cpu)[ipi] = info->irq;
	per_cpu(ipi_to_evtchn, cpu)[ipi] = evtchn;

	return xen_irq_info_common_setup(info, irq, IRQT_IPI, evtchn, 0);
	return xen_irq_info_common_setup(info, IRQT_IPI, evtchn, 0);
}

static int xen_irq_info_virq_setup(unsigned cpu,
				   unsigned irq,
				   evtchn_port_t evtchn,
				   unsigned virq)
static int xen_irq_info_virq_setup(struct irq_info *info, unsigned int cpu,
				   evtchn_port_t evtchn, unsigned int virq)
{
	struct irq_info *info = info_for_irq(irq);

	info->u.virq = virq;

	per_cpu(virq_to_irq, cpu)[virq] = irq;
	per_cpu(virq_to_irq, cpu)[virq] = info->irq;

	return xen_irq_info_common_setup(info, irq, IRQT_VIRQ, evtchn, 0);
	return xen_irq_info_common_setup(info, IRQT_VIRQ, evtchn, 0);
}

static int xen_irq_info_pirq_setup(unsigned irq,
				   evtchn_port_t evtchn,
				   unsigned pirq,
				   unsigned gsi,
				   uint16_t domid,
				   unsigned char flags)
static int xen_irq_info_pirq_setup(struct irq_info *info, evtchn_port_t evtchn,
				   unsigned int pirq, unsigned int gsi,
				   uint16_t domid, unsigned char flags)
{
	struct irq_info *info = info_for_irq(irq);

	info->u.pirq.pirq = pirq;
	info->u.pirq.gsi = gsi;
	info->u.pirq.domid = domid;
	info->u.pirq.flags = flags;

	return xen_irq_info_common_setup(info, irq, IRQT_PIRQ, evtchn, 0);
	return xen_irq_info_common_setup(info, IRQT_PIRQ, evtchn, 0);
}

static void xen_irq_info_cleanup(struct irq_info *info)
@@ -946,7 +924,6 @@ static void disable_pirq(struct irq_data *data)

int xen_irq_from_gsi(unsigned gsi)
{
	int irq;
	struct irq_info *info;

	list_for_each_entry(info, &xen_irq_list_head, list) {
@@ -977,20 +954,22 @@ static void __unbind_from_irq(struct irq_info *info, unsigned int irq)
			return;
	}

	evtchn = info->evtchn;

	if (VALID_EVTCHN(evtchn)) {
		unsigned int cpu = cpu_from_irq(irq);
		unsigned int cpu = info->cpu;
		struct xenbus_device *dev;

		if (!info->is_static)
			xen_evtchn_close(evtchn);
			close_evtchn = true;

		switch (type_from_irq(irq)) {
		switch (info->type) {
		case IRQT_VIRQ:
			per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1;
			per_cpu(virq_to_irq, cpu)[virq_from_irq(info)] = -1;
			break;
		case IRQT_IPI:
			per_cpu(ipi_to_irq, cpu)[ipi_from_irq(irq)] = -1;
			per_cpu(ipi_to_evtchn, cpu)[ipi_from_irq(irq)] = 0;
			per_cpu(ipi_to_irq, cpu)[ipi_from_irq(info)] = -1;
			per_cpu(ipi_to_evtchn, cpu)[ipi_from_irq(info)] = 0;
			break;
		case IRQT_EVTCHN:
			dev = info->u.interdomain;
@@ -1640,10 +1619,11 @@ EXPORT_SYMBOL_GPL(evtchn_get);

void evtchn_put(evtchn_port_t evtchn)
{
	int irq = get_evtchn_to_irq(evtchn);
	if (WARN_ON(irq == -1))
	struct irq_info *info = evtchn_to_info(evtchn);

	if (WARN_ON(!info))
		return;
	unbind_from_irq(irq);
	unbind_from_irq(info->irq);
}
EXPORT_SYMBOL_GPL(evtchn_put);

+1 −1
Original line number Diff line number Diff line
@@ -1013,7 +1013,7 @@ void event_file_put(struct trace_event_file *file)

static void remove_event_file_dir(struct trace_event_file *file)
{
	eventfs_remove(file->ef);
	eventfs_remove_dir(file->ei);
	list_del(&file->list);
	remove_subsystem(file->system);
	free_event_filter(file->filter);