xen/events: remove some simple helpers from events_base.c
[ Upstream commit 3bdb0ac350fe5e6301562143e4573971dd01ae0b ] 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: Juergen Gross <jgross@suse.com> Reviewed-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com> Signed-off-by: Juergen Gross <jgross@suse.com> Stable-dep-of: fa765c4b4aed ("xen/events: close evtchn after mapping cleanup") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
b79345efd0
commit
666860d56d
|
@ -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;
|
||||
|
@ -1208,15 +1199,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;
|
||||
|
@ -1239,9 +1231,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:
|
||||
|
@ -1579,13 +1571,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;
|
||||
|
@ -1601,7 +1587,6 @@ EXPORT_SYMBOL_GPL(evtchn_make_refcounted);
|
|||
|
||||
int evtchn_get(evtchn_port_t evtchn)
|
||||
{
|
||||
int irq;
|
||||
struct irq_info *info;
|
||||
int err = -ENOENT;
|
||||
|
||||
|
@ -1610,11 +1595,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;
|
||||
|
@ -1634,10 +1615,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);
|
||||
|
||||
|
@ -1667,12 +1649,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;
|
||||
|
||||
/*
|
||||
|
@ -1697,7 +1677,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;
|
||||
|
||||
|
@ -1711,7 +1690,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)
|
||||
|
@ -1769,7 +1748,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);
|
||||
|
|
Loading…
Reference in New Issue