Date: Tue, 27 Jan 2015 19:51:49 +0000 From: Sreekanth Rupavatharam <rupavath@juniper.net> To: hiren panchasara <hiren@strugglingcoder.info> Cc: "jfv@freebsd.org" <jfv@freebsd.org>, "freebsd-net@freebsd.org" <freebsd-net@freebsd.org> Subject: Re: Double cleanup in igb_attach Message-ID: <D0ED2984.1A86C%rupavath@juniper.net> In-Reply-To: <20150127192814.GA63990@strugglingcoder.info> References: <D0EC151C.1A7B1%rupavath@juniper.net> <20150127192814.GA63990@strugglingcoder.info>
next in thread | previous in thread | raw e-mail | index | archive | help
Hiren, Can you help commit this? Index: if_igb.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- if_igb.c (revision 298053) +++ if_igb.c (working copy) @@ -723,7 +723,8 @@ igb_attach(device_t dev) return (0); err_late: - igb_detach(dev); + if(igb_detach(dev) =3D=3D 0) /* igb_detach did the cleanup */ + return(error); igb_free_transmit_structures(adapter); igb_free_receive_structures(adapter); igb_release_hw_control(adapter); -- Thanks, Sreekanth On 1/27/15, 11:28 AM, "hiren panchasara" <hiren@strugglingcoder.info<mailto= :hiren@strugglingcoder.info>> wrote: + Jack On Tue, Jan 27, 2015 at 12:00:19AM +0000, Sreekanth Rupavatharam wrote: Apologies if this is not the right forum. In igb_attach function, we have t= his code. err_late: igb_detach(dev); igb_free_transmit_structures(adapter); igb_free_receive_structures(adapter); igb_release_hw_control(adapter); err_pci: igb_free_pci_resources(adapter); if (adapter->ifp !=3D NULL) if_free(adapter->ifp); free(adapter->mta, M_DEVBUF); IGB_CORE_LOCK_DESTROY(adapter); The problem is that igb_detach also does the same cleanup in it?s body. Onl= y exception is this case where it just returns EBUSY /* Make sure VLANS are not using driver */ if (if_vlantrunkinuse(ifp)) { device_printf(dev,"Vlan in use, detach first\n"); return (EBUSY); } I think the code in igb_attach should be changed to free up resources only = if the igb_detach returns an error. Here?s the patch for it. Index: if_igb.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- if_igb.c (revision 298025) +++ if_igb.c (working copy) @@ -723,7 +723,8 @@ igb_attach(device_t dev) return (0); err_late: - igb_detach(dev); + if(igb_detach(dev) =3D=3D 0) /* igb_detach did the cleanup */ + return; igb_free_transmit_structures(adapter); Can anyone comment on it and tell me if my understanding is incorrect? Seems reasonable to me at the first glance. We need to call IGB_CORE_LOCK_DESTROY(adapter) before returning though. cheers, Hiren
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?D0ED2984.1A86C%rupavath>