WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

Re: [Xen-ia64-devel] [Patch] fix warnings while rebooting

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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel