diff mbox series

[for-4.19] x86/physdev: Return pirq that irq was already mapped to

Message ID 20240708062554.399784-1-Jiqian.Chen@amd.com (mailing list archive)
State Superseded
Headers show
Series [for-4.19] x86/physdev: Return pirq that irq was already mapped to | expand

Commit Message

Chen, Jiqian July 8, 2024, 6:25 a.m. UTC
Fix bug imported by 0762e2502f1f ("x86/physdev: factor out the code to allocate and
map a pirq"). After that re-factoring, when pirq<0 and current_pirq>0, it means
caller want to allocate a free pirq for irq but irq already has a mapped pirq, then
it returns the negative pirq, so it fails. However, the logic before that
re-factoring is different, it should return the current_pirq that irq was already
mapped to and make the call success.

Fixes: 0762e2502f1f ("x86/physdev: factor out the code to allocate and map a pirq")

Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
Signed-off-by: Huang Rui <ray.huang@amd.com>
Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
---
 xen/arch/x86/irq.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Jan Beulich July 8, 2024, 6:56 a.m. UTC | #1
On 08.07.2024 08:25, Jiqian Chen wrote:
> Fix bug imported by 0762e2502f1f ("x86/physdev: factor out the code to allocate and

Nit: Perhaps s/imported/introduced/ ?

> map a pirq"). After that re-factoring, when pirq<0 and current_pirq>0, it means
> caller want to allocate a free pirq for irq but irq already has a mapped pirq, then
> it returns the negative pirq, so it fails. However, the logic before that
> re-factoring is different, it should return the current_pirq that irq was already
> mapped to and make the call success.
> 
> Fixes: 0762e2502f1f ("x86/physdev: factor out the code to allocate and map a pirq")
> 
> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>
> Signed-off-by: Huang Rui <ray.huang@amd.com>
> Signed-off-by: Jiqian Chen <Jiqian.Chen@amd.com>

Reviewed-by: Jan Beulich <jbeulich@suse.com>
diff mbox series

Patch

diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c
index 9a611c79e024..1a827ccc8498 100644
--- a/xen/arch/x86/irq.c
+++ b/xen/arch/x86/irq.c
@@ -2897,6 +2897,7 @@  static int allocate_pirq(struct domain *d, int index, int pirq, int irq,
                     d->domain_id, index, pirq, current_pirq);
             if ( current_pirq < 0 )
                 return -EBUSY;
+            pirq = current_pirq;
         }
         else if ( type == MAP_PIRQ_TYPE_MULTI_MSI )
         {