Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit df720c56 authored by Luca Fancellu's avatar Luca Fancellu Committed by Greg Kroah-Hartman
Browse files

xen/evtchn: Change irq_info lock to raw_spinlock_t



commit d120198bd5ff1d41808b6914e1eb89aff937415c upstream.

Unmask operation must be called with interrupt disabled,
on preempt_rt spin_lock_irqsave/spin_unlock_irqrestore
don't disable/enable interrupts, so use raw_* implementation
and change lock variable in struct irq_info from spinlock_t
to raw_spinlock_t

Cc: stable@vger.kernel.org
Fixes: 25da4618af24 ("xen/events: don't unmask an event channel when an eoi is pending")
Signed-off-by: default avatarLuca Fancellu <luca.fancellu@arm.com>
Reviewed-by: default avatarJulien Grall <jgrall@amazon.com>
Reviewed-by: default avatarWei Liu <wei.liu@kernel.org>
Link: https://lore.kernel.org/r/20210406105105.10141-1-luca.fancellu@arm.com


Signed-off-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent eab391e0
Loading
Loading
Loading
Loading
+5 −5
Original line number Original line Diff line number Diff line
@@ -221,7 +221,7 @@ static int xen_irq_info_common_setup(struct irq_info *info,
	info->evtchn = evtchn;
	info->evtchn = evtchn;
	info->cpu = cpu;
	info->cpu = cpu;
	info->mask_reason = EVT_MASK_REASON_EXPLICIT;
	info->mask_reason = EVT_MASK_REASON_EXPLICIT;
	spin_lock_init(&info->lock);
	raw_spin_lock_init(&info->lock);


	ret = set_evtchn_to_irq(evtchn, irq);
	ret = set_evtchn_to_irq(evtchn, irq);
	if (ret < 0)
	if (ret < 0)
@@ -373,28 +373,28 @@ static void do_mask(struct irq_info *info, u8 reason)
{
{
	unsigned long flags;
	unsigned long flags;


	spin_lock_irqsave(&info->lock, flags);
	raw_spin_lock_irqsave(&info->lock, flags);


	if (!info->mask_reason)
	if (!info->mask_reason)
		mask_evtchn(info->evtchn);
		mask_evtchn(info->evtchn);


	info->mask_reason |= reason;
	info->mask_reason |= reason;


	spin_unlock_irqrestore(&info->lock, flags);
	raw_spin_unlock_irqrestore(&info->lock, flags);
}
}


static void do_unmask(struct irq_info *info, u8 reason)
static void do_unmask(struct irq_info *info, u8 reason)
{
{
	unsigned long flags;
	unsigned long flags;


	spin_lock_irqsave(&info->lock, flags);
	raw_spin_lock_irqsave(&info->lock, flags);


	info->mask_reason &= ~reason;
	info->mask_reason &= ~reason;


	if (!info->mask_reason)
	if (!info->mask_reason)
		unmask_evtchn(info->evtchn);
		unmask_evtchn(info->evtchn);


	spin_unlock_irqrestore(&info->lock, flags);
	raw_spin_unlock_irqrestore(&info->lock, flags);
}
}


#ifdef CONFIG_X86
#ifdef CONFIG_X86
+1 −1
Original line number Original line Diff line number Diff line
@@ -47,7 +47,7 @@ struct irq_info {
	unsigned short eoi_cpu;	/* EOI must happen on this cpu */
	unsigned short eoi_cpu;	/* EOI must happen on this cpu */
	unsigned int irq_epoch;	/* If eoi_cpu valid: irq_epoch of event */
	unsigned int irq_epoch;	/* If eoi_cpu valid: irq_epoch of event */
	u64 eoi_time;		/* Time in jiffies when to EOI. */
	u64 eoi_time;		/* Time in jiffies when to EOI. */
	spinlock_t lock;
	raw_spinlock_t lock;


	union {
	union {
		unsigned short virq;
		unsigned short virq;