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

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
...@@ -248,15 +248,6 @@ static int set_evtchn_to_irq(evtchn_port_t evtchn, unsigned int irq) ...@@ -248,15 +248,6 @@ static int set_evtchn_to_irq(evtchn_port_t evtchn, unsigned int irq)
return 0; 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 */ /* Get info for IRQ */
static struct irq_info *info_for_irq(unsigned 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) ...@@ -274,6 +265,19 @@ static void set_info_for_irq(unsigned int irq, struct irq_info *info)
irq_set_chip_data(irq, 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 */ /* Per CPU channel accounting */
static void channels_on_cpu_dec(struct irq_info *info) static void channels_on_cpu_dec(struct irq_info *info)
{ {
...@@ -429,7 +433,9 @@ static evtchn_port_t evtchn_from_irq(unsigned int irq) ...@@ -429,7 +433,9 @@ static evtchn_port_t evtchn_from_irq(unsigned int irq)
unsigned int irq_from_evtchn(evtchn_port_t evtchn) 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); EXPORT_SYMBOL_GPL(irq_from_evtchn);
...@@ -473,25 +479,11 @@ static unsigned pirq_from_irq(unsigned irq) ...@@ -473,25 +479,11 @@ static unsigned pirq_from_irq(unsigned irq)
return info->u.pirq.pirq; 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) unsigned int cpu_from_evtchn(evtchn_port_t evtchn)
{ {
int irq = get_evtchn_to_irq(evtchn); struct irq_info *info = evtchn_to_info(evtchn);
unsigned ret = 0;
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) static void do_mask(struct irq_info *info, u8 reason)
...@@ -540,13 +532,12 @@ static bool pirq_needs_eoi_flag(unsigned irq) ...@@ -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, static void bind_evtchn_to_cpu(evtchn_port_t evtchn, unsigned int cpu,
bool force_affinity) bool force_affinity)
{ {
int irq = get_evtchn_to_irq(evtchn); struct irq_info *info = evtchn_to_info(evtchn);
struct irq_info *info = info_for_irq(irq);
BUG_ON(irq == -1); BUG_ON(info == NULL);
if (IS_ENABLED(CONFIG_SMP) && force_affinity) { 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_affinity(data, cpumask_of(cpu));
irq_data_update_effective_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) ...@@ -979,13 +970,13 @@ static void __unbind_from_irq(unsigned int irq)
} }
if (VALID_EVTCHN(evtchn)) { if (VALID_EVTCHN(evtchn)) {
unsigned int cpu = cpu_from_irq(irq); unsigned int cpu = info->cpu;
struct xenbus_device *dev; struct xenbus_device *dev;
if (!info->is_static) if (!info->is_static)
xen_evtchn_close(evtchn); xen_evtchn_close(evtchn);
switch (type_from_irq(irq)) { switch (info->type) {
case IRQT_VIRQ: case IRQT_VIRQ:
per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1; per_cpu(virq_to_irq, cpu)[virq_from_irq(irq)] = -1;
break; break;
...@@ -1185,15 +1176,16 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip, ...@@ -1185,15 +1176,16 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip,
{ {
int irq; int irq;
int ret; int ret;
struct irq_info *info;
if (evtchn >= xen_evtchn_max_channels()) if (evtchn >= xen_evtchn_max_channels())
return -ENOMEM; return -ENOMEM;
mutex_lock(&irq_mapping_update_lock); 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(); irq = xen_allocate_irq_dynamic();
if (irq < 0) if (irq < 0)
goto out; goto out;
...@@ -1216,9 +1208,9 @@ static int bind_evtchn_to_irq_chip(evtchn_port_t evtchn, struct irq_chip *chip, ...@@ -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); bind_evtchn_to_cpu(evtchn, 0, false);
} else { } else {
struct irq_info *info = info_for_irq(irq); if (!WARN_ON(info->type != IRQT_EVTCHN))
if (!WARN_ON(!info || info->type != IRQT_EVTCHN))
info->refcnt++; info->refcnt++;
irq = info->irq;
} }
out: out:
...@@ -1556,13 +1548,7 @@ EXPORT_SYMBOL_GPL(xen_set_irq_priority); ...@@ -1556,13 +1548,7 @@ EXPORT_SYMBOL_GPL(xen_set_irq_priority);
int evtchn_make_refcounted(evtchn_port_t evtchn, bool is_static) int evtchn_make_refcounted(evtchn_port_t evtchn, bool is_static)
{ {
int irq = get_evtchn_to_irq(evtchn); struct irq_info *info = evtchn_to_info(evtchn);
struct irq_info *info;
if (irq == -1)
return -ENOENT;
info = info_for_irq(irq);
if (!info) if (!info)
return -ENOENT; return -ENOENT;
...@@ -1578,7 +1564,6 @@ EXPORT_SYMBOL_GPL(evtchn_make_refcounted); ...@@ -1578,7 +1564,6 @@ EXPORT_SYMBOL_GPL(evtchn_make_refcounted);
int evtchn_get(evtchn_port_t evtchn) int evtchn_get(evtchn_port_t evtchn)
{ {
int irq;
struct irq_info *info; struct irq_info *info;
int err = -ENOENT; int err = -ENOENT;
...@@ -1587,11 +1572,7 @@ int evtchn_get(evtchn_port_t evtchn) ...@@ -1587,11 +1572,7 @@ int evtchn_get(evtchn_port_t evtchn)
mutex_lock(&irq_mapping_update_lock); mutex_lock(&irq_mapping_update_lock);
irq = get_evtchn_to_irq(evtchn); info = evtchn_to_info(evtchn);
if (irq == -1)
goto done;
info = info_for_irq(irq);
if (!info) if (!info)
goto done; goto done;
...@@ -1611,10 +1592,11 @@ EXPORT_SYMBOL_GPL(evtchn_get); ...@@ -1611,10 +1592,11 @@ EXPORT_SYMBOL_GPL(evtchn_get);
void evtchn_put(evtchn_port_t evtchn) void evtchn_put(evtchn_port_t evtchn)
{ {
int irq = get_evtchn_to_irq(evtchn); struct irq_info *info = evtchn_to_info(evtchn);
if (WARN_ON(irq == -1))
if (WARN_ON(!info))
return; return;
unbind_from_irq(irq); unbind_from_irq(info->irq);
} }
EXPORT_SYMBOL_GPL(evtchn_put); EXPORT_SYMBOL_GPL(evtchn_put);
...@@ -1644,12 +1626,10 @@ struct evtchn_loop_ctrl { ...@@ -1644,12 +1626,10 @@ struct evtchn_loop_ctrl {
void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl) void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl)
{ {
int irq; struct irq_info *info = evtchn_to_info(port);
struct irq_info *info;
struct xenbus_device *dev; struct xenbus_device *dev;
irq = get_evtchn_to_irq(port); if (!info)
if (irq == -1)
return; return;
/* /*
...@@ -1674,7 +1654,6 @@ void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl) ...@@ -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)) if (xchg_acquire(&info->is_active, 1))
return; return;
...@@ -1688,7 +1667,7 @@ void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl) ...@@ -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; info->eoi_time = get_jiffies_64() + event_eoi_delay;
} }
generic_handle_irq(irq); generic_handle_irq(info->irq);
} }
int xen_evtchn_do_upcall(void) int xen_evtchn_do_upcall(void)
...@@ -1746,7 +1725,7 @@ void rebind_evtchn_irq(evtchn_port_t evtchn, int irq) ...@@ -1746,7 +1725,7 @@ void rebind_evtchn_irq(evtchn_port_t evtchn, int irq)
mutex_lock(&irq_mapping_update_lock); mutex_lock(&irq_mapping_update_lock);
/* After resume the irq<->evtchn mappings are all cleared out */ /* 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, /* Expect irq to have been bound before,
so there should be a proper type */ so there should be a proper type */
BUG_ON(info->type == IRQT_UNBOUND); BUG_ON(info->type == IRQT_UNBOUND);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment