Commit 3bdb0ac3 authored by Juergen Gross's avatar Juergen Gross
Browse files

xen/events: remove some simple helpers from events_base.c



The helper functions type_from_irq() and cpu_from_irq() are just one
line functions used only internally.

Open code them where needed. At the same time modify and rename
get_evtchn_to_irq() to return a struct irq_info instead of the IRQ
number.

Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
Reviewed-by: default avatarOleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
parent 68646451
Loading
Loading
Loading
Loading
+38 −59
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;
}

static 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)
{
@@ -274,6 +265,19 @@ static void set_info_for_irq(unsigned int irq, struct irq_info *info)
		irq_set_chip_data(irq, info);
}

static struct irq_info *evtchn_to_info(evtchn_port_t evtchn)
{
	int irq;

	if (evtchn >= xen_evtchn_max_channels())
		return NULL;
	if (evtchn_to_irq[EVTCHN_ROW(evtchn)] == NULL)
		return NULL;
	irq = READ_ONCE(evtchn_to_irq[EVTCHN_ROW(evtchn)][EVTCHN_COL(evtchn)]);

	return (irq < 0) ? NULL : info_for_irq(irq);
}

/* Per CPU channel accounting */
static void channels_on_cpu_dec(struct irq_info *info)
{
@@ -429,7 +433,9 @@ static evtchn_port_t evtchn_from_irq(unsigned int irq)

unsigned int irq_from_evtchn(evtchn_port_t evtchn)
{
	return get_evtchn_to_irq(evtchn);
	struct irq_info *info = evtchn_to_info(evtchn);

	return info ? info->irq : -1;
}
EXPORT_SYMBOL_GPL(irq_from_evtchn);

@@ -473,25 +479,11 @@ static unsigned pirq_from_irq(unsigned irq)
	return info->u.pirq.pirq;
}

static enum xen_irq_type type_from_irq(unsigned irq)
{
	return info_for_irq(irq)->type;
}

static unsigned cpu_from_irq(unsigned irq)
{
	return info_for_irq(irq)->cpu;
}

unsigned int cpu_from_evtchn(evtchn_port_t evtchn)
{
	int irq = get_evtchn_to_irq(evtchn);
	unsigned ret = 0;
	struct irq_info *info = evtchn_to_info(evtchn);

	if (irq != -1)
		ret = cpu_from_irq(irq);

	return ret;
	return info ? info->cpu : 0;
}

static void do_mask(struct irq_info *info, u8 reason)
@@ -540,13 +532,12 @@ static bool pirq_needs_eoi_flag(unsigned irq)
static void bind_evtchn_to_cpu(evtchn_port_t evtchn, unsigned int cpu,
			       bool force_affinity)
{
	int irq = get_evtchn_to_irq(evtchn);
	struct irq_info *info = info_for_irq(irq);
	struct irq_info *info = evtchn_to_info(evtchn);

	BUG_ON(irq == -1);
	BUG_ON(info == NULL);

	if (IS_ENABLED(CONFIG_SMP) && force_affinity) {
		struct irq_data *data = irq_get_irq_data(irq);
		struct irq_data *data = irq_get_irq_data(info->irq);

		irq_data_update_affinity(data, cpumask_of(cpu));
		irq_data_update_effective_affinity(data, cpumask_of(cpu));
@@ -979,13 +970,13 @@ static void __unbind_from_irq(unsigned int irq)
	}

	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);

		switch (type_from_irq(irq)) {
		switch (info->type) {
		case IRQT_VIRQ:
			per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1;
			break;
@@ -1185,15 +1176,16 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip,
{
	int irq;
	int ret;
	struct irq_info *info;

	if (evtchn >= xen_evtchn_max_channels())
		return -ENOMEM;

	mutex_lock(&irq_mapping_update_lock);

	irq = get_evtchn_to_irq(evtchn);
	info = evtchn_to_info(evtchn);

	if (irq == -1) {
	if (!info) {
		irq = xen_allocate_irq_dynamic();
		if (irq < 0)
			goto out;
@@ -1216,9 +1208,9 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip,
		 */
		bind_evtchn_to_cpu(evtchn, 0, false);
	} else {
		struct irq_info *info = info_for_irq(irq);
		if (!WARN_ON(!info || info->type != IRQT_EVTCHN))
		if (!WARN_ON(info->type != IRQT_EVTCHN))
			info->refcnt++;
		irq = info->irq;
	}

out:
@@ -1556,13 +1548,7 @@ EXPORT_SYMBOL_GPL(xen_set_irq_priority);

int evtchn_make_refcounted(evtchn_port_t evtchn, bool is_static)
{
	int irq = get_evtchn_to_irq(evtchn);
	struct irq_info *info;

	if (irq == -1)
		return -ENOENT;

	info = info_for_irq(irq);
	struct irq_info *info = evtchn_to_info(evtchn);

	if (!info)
		return -ENOENT;
@@ -1578,7 +1564,6 @@ EXPORT_SYMBOL_GPL(evtchn_make_refcounted);

int evtchn_get(evtchn_port_t evtchn)
{
	int irq;
	struct irq_info *info;
	int err = -ENOENT;

@@ -1587,11 +1572,7 @@ int evtchn_get(evtchn_port_t evtchn)

	mutex_lock(&irq_mapping_update_lock);

	irq = get_evtchn_to_irq(evtchn);
	if (irq == -1)
		goto done;

	info = info_for_irq(irq);
	info = evtchn_to_info(evtchn);

	if (!info)
		goto done;
@@ -1611,10 +1592,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);

@@ -1644,12 +1626,10 @@ struct evtchn_loop_ctrl {

void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl)
{
	int irq;
	struct irq_info *info;
	struct irq_info *info = evtchn_to_info(port);
	struct xenbus_device *dev;

	irq = get_evtchn_to_irq(port);
	if (irq == -1)
	if (!info)
		return;

	/*
@@ -1674,7 +1654,6 @@ void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl)
		}
	}

	info = info_for_irq(irq);
	if (xchg_acquire(&info->is_active, 1))
		return;

@@ -1688,7 +1667,7 @@ void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl)
		info->eoi_time = get_jiffies_64() + event_eoi_delay;
	}

	generic_handle_irq(irq);
	generic_handle_irq(info->irq);
}

int xen_evtchn_do_upcall(void)
@@ -1746,7 +1725,7 @@ void rebind_evtchn_irq(evtchn_port_t evtchn, int irq)
	mutex_lock(&irq_mapping_update_lock);

	/* After resume the irq<->evtchn mappings are all cleared out */
	BUG_ON(get_evtchn_to_irq(evtchn) != -1);
	BUG_ON(evtchn_to_info(evtchn));
	/* Expect irq to have been bound before,
	   so there should be a proper type */
	BUG_ON(info->type == IRQT_UNBOUND);