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
|