|
|
|
|
|
|
|
|
|
|
xen-bugs
[Xen-bugs] [Bug 90] Oops on vif teardown
http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=90
------- Additional Comments From ryanh@xxxxxxxxxx 2005-08-19 18:58 -------
The real race is between when a call_rcu() callback runs and when the
netif_destroy() calls unregister_netdev().
When we get an oops, the brctl delif IOCTL has run, and br_del_if() has
been called setting the port state to DISABLED, and then queues up an
rcu callback, destroy_npb(), which will set dev->br_port = NULL.
add_del_if() // IOCTL handler from brctl delif
// xen-br0 $VIF
br_del_if()
del_nbp()
br_stp_disable_port() // Set port->state = BR_STATE_DISABLED
call_rcu(destroy_nbp_rcu) // setup rcu callback to run
// destory_nbp() which will set
// dev->br_port = NULL
After the xen scripts have called the brctl command, xend sends the
disconnect and destroy control messages, which trigger:
netif_destroy()
unregister_netdev()
unregister_netdevice()
notify_call_chain(NETDEV_UNREGISTER)
br_device_event() // The first thing done here is to check
// the device's br_port to see if it is
// NULL
If the destory_nbp_rcu() callback isn't fired before br_device_event()
checks dev->br_port, then the NULL check fails and a second call to
br_del_if() is invoked and we blow up in sysfs/kobject BUG_ON() for ref
counts of dentrys. [2]
--
Configure bugmail:
http://bugzilla.xensource.com/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
_______________________________________________
Xen-bugs mailing list
Xen-bugs@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-bugs
|
|
|
|
|