Skip to content

Commit

Permalink
xen/events: remove some simple helpers from events_base.c
Browse files Browse the repository at this point in the history
[ Upstream commit 3bdb0ac ]

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: fa765c4 ("xen/events: close evtchn after mapping cleanup")
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
jgross1 authored and gregkh committed Mar 1, 2024
1 parent b79345e commit 666860d
Showing 1 changed file with 38 additions and 59 deletions.
97 changes: 38 additions & 59 deletions drivers/xen/events/events_base.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand All @@ -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)
{
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;

if (irq != -1)
ret = cpu_from_irq(irq);
struct irq_info *info = evtchn_to_info(evtchn);

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

static void do_mask(struct irq_info *info, u8 reason)
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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:
Expand Down Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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;
Expand All @@ -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);

Expand Down Expand Up @@ -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;

/*
Expand All @@ -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;

Expand All @@ -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)
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 666860d

Please sign in to comment.