[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [Xen-devel] [PATCH][RFC] pv-ops: fix shared irq device passthrough



Jeremy Fitzhardinge wrote:
> On 10/23/09 04:39, Han, Weidong wrote:
>> From 9c91f23076c555690488cbd81f889f279d4cf2fa Mon Sep 17 00:00:00
>> 2001 
>> From: Weidong Han <weidong.han@xxxxxxxxx>
>> Date: Sat, 24 Oct 2009 03:18:30 +0800
>> Subject: [PATCH] pv-ops: fix shared irq device passthrough
>> 
>> In driver/xen/events.c, whether bind_pirq is shareable or not is
>> determined by desc->action is NULL or not. But in __setup_irq,
>> startup(irq) is invoked before desc->action is assigned with
>> new action. So desc->action in startup_irq is alwasy NULL, and
>> bind_pirq is always not shareable. This results in pt_irq_create_bind
>> failure when passthrough a device which shares irq to other devices.
>> 
>> This patch move desc->action before startup(irq), therefore fix
>> the problem.
>> 
> 
> Hm, not sure about this.  The logic in __setup_irq already looks
> pretty tortured, and I'd like to avoid touching it unless there's
> definitively a bug in there.
> 
> I think the right question is whether probe_irq() is really doing the
> right test, and whether it could do something else instead?

Totally agree. The better way is to change probe_irq, therefore needn't touch 
kernel irq stuffs. probe_irq is just check if desc->action == NULL or not. The 
code is there for a long long time (from c/s 26 in linux-2.6.18-xen.hg). I 
don't know whether it can be replaced. 

Regards,
Weidong

> 
>     J
> 
>> Signed-off-by: Weidong Han <weidong.han@xxxxxxxxx>
>> ---
>>  kernel/irq/manage.c |   14 ++++++++++----
>>  1 files changed, 10 insertions(+), 4 deletions(-)
>> 
>> diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
>> index 07a11dc..3b85b72 100644
>> --- a/kernel/irq/manage.c
>> +++ b/kernel/irq/manage.c
>> @@ -565,6 +565,7 @@ __setup_irq(unsigned int irq, struct irq_desc
>>      *desc, struct irqaction *new)  { struct irqaction *old, **old_ptr;
>>      const char *old_name = NULL;
>> +    int old_irq;
>>      unsigned long flags;
>>      int shared = 0;
>>      int ret;
>> @@ -644,6 +645,11 @@ __setup_irq(unsigned int irq, struct irq_desc
>>      *desc, struct irqaction *new)           shared = 1; }
>> 
>> +    old = *old_ptr;
>> +    old_irq = new->irq;
>> +    new->irq = irq;
>> +    *old_ptr = new;
>> +
>>      if (!shared) {
>>              irq_chip_set_defaults(desc->chip);
>> 
>> @@ -654,8 +660,11 @@ __setup_irq(unsigned int irq, struct irq_desc
>>                      *desc, struct irqaction *new) ret = 
>> __irq_set_trigger(desc, irq,
>>                                      new->flags & IRQF_TRIGGER_MASK);
>> 
>> -                    if (ret)
>> +                    if (ret) {
>> +                            new->irq = old_irq;
>> +                            *old_ptr = old;
>>                              goto out_thread;
>> +                    }
>>              } else
>>                      compat_irq_chip_set_default_handler(desc);
>>  #if defined(CONFIG_IRQ_PER_CPU)
>> @@ -690,9 +699,6 @@ __setup_irq(unsigned int irq, struct irq_desc
>>                              *desc, struct irqaction *new) (int)(new->flags &
>>      IRQF_TRIGGER_MASK)); }
>> 
>> -    new->irq = irq;
>> -    *old_ptr = new;
>> -
>>      /* Reset broken irq detection when installing new handler */ 
>>      desc->irq_count = 0; desc->irqs_unhandled = 0;


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.