Thread (1 message) 1 message, 1 author, 2009-01-09
  • (off-list ancestor, not in this archive)
  • Re: mal_probe crash · Geert Uytterhoeven <hidden> · 2009-01-09

Re: mal_probe crash

From: Geert Uytterhoeven <hidden>
Date: 2009-01-09 14:42:32

On Thu, 8 Jan 2009, Benjamin Herrenschmidt wrote:
On Thu, 2009-01-08 at 15:46 -0500, Josh Boyer wrote:
quoted
On Wed, Jan 07, 2009 at 03:44:34PM -0500, Sean MacLennan wrote:
quoted
With Linus' latest git, mal_probe crashes. It calls netif_napi_add with
the first parameter NULL. This was ok since the parameter, a net
device, was only used if CONFIG_NETPOLL was set.

Now it is always de-referenced. A quick check shows that ibm_newemac is
the only driver that passed NULL as the first parameter to this call in
2.6.28.

I don't really follow ibm_newemac changes, so the patch may be waiting
to be applied. This is really just a heads up.
I haven't heard of that, so I doubt there's a patch pending.  *Sigh*
There isn't that I know of. The EMAC code creates a single NAPI instance
for all EMACs and I think used to completely disconnect things. The old
code created a fake netdev just for NAPI, that became unnecessary with
the new NAPI stuff.... but it looks like the way we do things now
displeases some changes in the network stack. I'll have to dig.
Verified on my Sequoia (which now lost its network :-(

The regression/problem (requiring a valid net_device in netif_napi_add(), even
if CONFIG_NETPOLL=n) seems to be introduced by commit
d565b0a1a9b6ee7dff46e1f68b26b526ac11ae50 ("net: Add Generic Receive Offload
infrastructure").

However, it was broken before, in case CONFIG_NETPOLL=y.

So mal_probe() (triggered by mal_init()) needs to know about the net_device
before it has been allocated by emac_probe() (triggered by
of_register_platform_driver(&emac_driver)):

| static int __init emac_init(void)
| {
| 	int rc;
| 
| 	printk(KERN_INFO DRV_DESC ", version " DRV_VERSION "\n");
| 
| 	/* Init debug stuff */
| 	emac_init_debug();
| 
| 	/* Build EMAC boot list */
| 	emac_make_bootlist();
| 
| 	/* Init submodules */
| 	rc = mal_init();
| 	if (rc)
| 		goto err;
| 	rc = zmii_init();
| 	if (rc)
| 		goto err_mal;
| 	rc = rgmii_init();
| 	if (rc)
| 		goto err_zmii;
| 	rc = tah_init();
| 	if (rc)
| 		goto err_rgmii;
| 	rc = of_register_platform_driver(&emac_driver);
| 	if (rc)
| 		goto err_tah;
| 
| 	return 0;
| 
|  err_tah:
| 	tah_exit();
|  err_rgmii:
| 	rgmii_exit();
|  err_zmii:
| 	zmii_exit();
|  err_mal:
| 	mal_exit();
|  err:
| 	return rc;
| }

Can the order of mal_init() and of_register_platform_driver(&emac_driver) be
reversed? If yes, there still has some link to be made between the mal and the
emac devices.

With kind regards,

Geert Uytterhoeven
Software Architect

Sony Techsoft Centre Europe
The Corporate Village · Da Vincilaan 7-D1 · B-1935 Zaventem · Belgium

Phone:    +32 (0)2 700 8453
Fax:      +32 (0)2 700 8622
E-mail:   Geert.Uytterhoeven@sonycom.com
Internet: http://www.sony-europe.com/

A division of Sony Europe (Belgium) N.V.
VAT BE 0413.825.160 · RPR Brussels
Fortis · BIC GEBABEBB · IBAN BE41293037680010
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help