diff mbox

[net-next] vmxnet3: set netdev parant device before calling netdev_info

Message ID alpine.LRH.2.00.1107201834220.19334@sbhatewara-dev1.eng.vmware.com
State Accepted, archived
Delegated to: David Miller
Headers show

Commit Message

Shreyas Bhatewara July 21, 2011, 2:01 a.m. UTC
Parent device for netdev should be set before netdev_info() can be called
otherwise there is a NULL pointer dereference and probe() fails.

Signed-off-by: Shreyas N Bhatewara <sbhatewara@vmware.com>

--

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Scott J. Goldman July 21, 2011, 3:06 a.m. UTC | #1
> Parent device for netdev should be set before netdev_info() can be called
> otherwise there is a NULL pointer dereference and probe() fails.

> Signed-off-by: Shreyas N Bhatewara <sbhatewara@vmware.com>
Signed-off-by: Scott J. Goldman <scottjg@vmware.com>--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Joe Perches July 21, 2011, 3:49 a.m. UTC | #2
On Wed, 2011-07-20 at 20:06 -0700, Scott Goldman wrote:
> > Parent device for netdev should be set before netdev_info() can be called
> > otherwise there is a NULL pointer dereference and probe() fails.

I believe this is not true.
I don't see any NULL pointer dereference here.
functions and macros reordered top to bottom.

define_netdev_printk_level(netdev_info, KERN_INFO);

#define define_netdev_printk_level(func, level)			\
int func(const struct net_device *dev, const char *fmt, ...)	\
{								\
	int r;							\
	struct va_format vaf;					\
	va_list args;						\
								\
	va_start(args, fmt);					\
								\
	vaf.fmt = fmt;						\
	vaf.va = &args;						\
								\
	r = __netdev_printk(level, dev, &vaf);			\
	va_end(args);						\
								\
	return r;						\
}								\
EXPORT_SYMBOL(func);

static int __netdev_printk(const char *level, const struct net_device *dev,
			   struct va_format *vaf)
{
	int r;

	if (dev && dev->dev.parent)
		r = dev_printk(level, dev->dev.parent, "%s: %pV",
			       netdev_name(dev), vaf);
	else if (dev)
		r = printk("%s%s: %pV", level, netdev_name(dev), vaf);
	else
		r = printk("%s(NULL net_device): %pV", level, vaf);

	return r;
}

static inline const char *netdev_name(const struct net_device *dev)
{
	if (dev->reg_state != NETREG_REGISTERED)
		return "(unregistered net_device)";
	return dev->name;
}


--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Shreyas Bhatewara July 21, 2011, 4:05 a.m. UTC | #3
> -----Original Message-----

> From: Joe Perches [mailto:joe@perches.com]

> Sent: Wednesday, July 20, 2011 8:49 PM

> To: Scott Goldman

> Cc: Shreyas Bhatewara; netdev@vger.kernel.org; pv-drivers@vmware.com

> Subject: RE: [Pv-drivers] [PATCH net-next] vmxnet3: set netdev parant

> device before calling netdev_info

> 

> On Wed, 2011-07-20 at 20:06 -0700, Scott Goldman wrote:

> > > Parent device for netdev should be set before netdev_info() can be

> called

> > > otherwise there is a NULL pointer dereference and probe() fails.

> 

> I believe this is not true.

> I don't see any NULL pointer dereference here.

> functions and macros reordered top to bottom.

> 



Thanks for looking Joe.
This happened in 2.6.36. I saw the panic in 2.6.34 and assumed that it would be same
in the latest kernel.
It would not panic in 3.0 but it is good to have the parent device set early.
David Miller July 22, 2011, 4:34 a.m. UTC | #4
From: Shreyas Bhatewara <sbhatewara@vmware.com>
Date: Wed, 20 Jul 2011 19:01:11 -0700 (PDT)

> 
> Parent device for netdev should be set before netdev_info() can be called
> otherwise there is a NULL pointer dereference and probe() fails.
> 
> Signed-off-by: Shreyas N Bhatewara <sbhatewara@vmware.com>

Applied.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 009277e..1a8cc5b 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2993,6 +2993,7 @@  vmxnet3_probe_device(struct pci_dev *pdev,
 		goto err_ver;
 	}
 
+	SET_NETDEV_DEV(netdev, &pdev->dev);
 	vmxnet3_declare_features(adapter, dma64);
 
 	adapter->dev_number = atomic_read(&devices_found);
@@ -3038,7 +3039,6 @@  vmxnet3_probe_device(struct pci_dev *pdev,
 	netif_set_real_num_tx_queues(adapter->netdev, adapter->num_tx_queues);
 	netif_set_real_num_rx_queues(adapter->netdev, adapter->num_rx_queues);
 
-	SET_NETDEV_DEV(netdev, &pdev->dev);
 	err = register_netdev(netdev);
 
 	if (err) {