Hi, Aron

>Hi Akio,
>
>I'm sorry, but I'm confused by your message.  Are you saying there are
>two problems here?  One problem in xen/ia64 and one problem in the
>e1000 driver?
Yes, there are two problem here.
1. "double free" message is happened
2. CallTrace is happened

problem 1 is a issue of free_irq_vector.
My patch fix this problem.

problem 2 is a issue of some network drivers.
suspend handlers of e1000, tg3 and so on are not called free_irq().
free_irq() is called by only close handlers of them.
So if close handlers are not called before suspend handlers,
iosapic_unregister_intr() call WARN_ON(1).

iosapic_unregister_intr (unsigned int gsi)
{
        unsigned long flags;
        int irq, vector, index;
[snip...]
                        memset(&iosapic_intr_info[vector], 0,
                               sizeof(struct iosapic_intr_info));
                        iosapic_intr_info[vector].low32 |= IOSAPIC_MASK;
                        INIT_LIST_HEAD(&iosapic_intr_info[vector].rtes);

                        if (idesc->action) {
                                printk(KERN_ERR
                                       "interrupt handlers still exist on"
                                       "IRQ %u\n", irq);
                                WARN_ON(1); <----------------HERE!!!!!!!!!!
                        }

                        /* Free the interrupt vector */
                        free_irq_vector(vector);
                }
[snip...]
}

I think there are three solutions.
A. do "# /etc/xen/scripts/network-bridge stop" before reboot
   I think this is the best solution. But if we do that, where is better?
   /etc/init.d/network or /etc/init.d/xend?
   And How do we do in the case of routing mode?
   
B. apply the e1000 patch(I think other driver also apply likely patch.)
   I think the better solution.
   But I'm not familiar with e1000 driver.
   So I'd like to review it by RH Engineer and community people.
   
   The patch is the below.
   
http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=edd106fc8ac1826dbe231b70ce0762db24133e5c;hp=e78181feb0b94fb6afeaef3b28d4f5df1b847c98
   
C. ifdef the WARN_ON(1) in iosapic_unregister_intr.
   This is the easiest solution.
   And because Xen don't do I/O Hotplug, this may be the best.

>You sent a patch, I guess that is for xen-ia64-unstable, right?  If
>that is ready to be applied, could you include a description of the
>problem and what the patch does?
>
Yes, my patch is for xen-ia64-unstable.
My patch fix problem 1 ("double free" messages).
I already have patches for RHEL5 beta.
I'll send you soon if my patch is applied in xen-ia64-unstable.

- Bug escription
  Please see the following two functions.
  assign_irq_vector() is para-virulized, free_irq_vector() is not 
para-virtualized.
  So ia64_vector_mask is not used in dom0 kernel.
  Though free_irq_vector() try to clear ia64_vector_mask in dom0 kernel,
  ia64_vector_mask is always zero, so the double free message is happened.
  
int
assign_irq_vector (int irq)
{
        int pos, vector;

#ifdef CONFIG_XEN
        if (is_running_on_xen()) {
                extern int xen_assign_irq_vector(int);
                return xen_assign_irq_vector(irq);
        }
#endif
 again:
        pos = find_first_zero_bit(ia64_vector_mask, IA64_NUM_DEVICE_VECTORS);
        vector = IA64_FIRST_DEVICE_VECTOR + pos;
        if (vector > IA64_LAST_DEVICE_VECTOR)
                return -ENOSPC;
        if (test_and_set_bit(pos, ia64_vector_mask))
                goto again;
        return vector;
}

void
free_irq_vector (int vector)
{
        int pos;

        if (vector < IA64_FIRST_DEVICE_VECTOR || vector > 
IA64_LAST_DEVICE_VECTOR)
                return;

        pos = vector - IA64_FIRST_DEVICE_VECTOR;
        if (!test_and_clear_bit(pos, ia64_vector_mask))
                printk(KERN_WARNING "%s: double free!\n", __FUNCTION__); 
<----HERE!!!!
}



- What the patch does?
  I do that free_irq_vector() is para-virtualized.


>Regarding the e1000 bug, could you comment in the RH bug?
>https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=208599
>
Yes.

Best Regards,

Akio Takebe


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

Reply via email to