Openwrt/target/linux/layerscape/patches-5.4/701-net-0338-net-dsa-felix-Fix-probing-allocation-and-cleanup-pat.patch
Adrian Schmutzler cf7c101135 layerscape: remove useless pairs of kernel patches
The layerscape kernel patches appears to be just some uncleaned local
development tree, where patches are sometimes directly followed by
their revert. While this does not seem a problem in the first place,
it becomes incredibly unpleasant when the upstream kernel changes in
the relevant areas and requires rebase.

This removes all these patch-revert pairs and refreshs the rest.

It removes about 44000 lines of entirely useless code.

Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
2020-08-20 14:19:39 +02:00

124 lines
5.0 KiB
Diff

From 5ae4c4ac2d992afcf4087e5f33ad7e5f7d073fbf Mon Sep 17 00:00:00 2001
From: Claudiu Manoil <claudiu.manoil@nxp.com>
Date: Wed, 4 Dec 2019 14:36:09 +0200
Subject: [PATCH] net: dsa: felix: Fix probing allocation and cleanup path
dsa_switch_alloc() uses managed (devm_alloc) allocation
to alloc 'ds'. kfree()-ing 'ds' results in memory corruption.
kfree(ds) seems harmless on the error path, however for this
particular device, dsa_register_swtich() deffers probing to
allow the enetc driver to probe the master port first.
This results in kfree(ds) being called during the first
probing attempt of felix, followed by a NULL poiter access
crash during enetc driver probing (when accessing its net_device).
This patch fixes following crash (triggerred in the enetc driver by
the probing routine of the felix driver):
[ 3.502254] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
[ 3.511073] Mem abort info:
[ 3.513874] ESR = 0x96000044
[ 3.516936] EC = 0x25: DABT (current EL), IL = 32 bits
[ 3.522266] SET = 0, FnV = 0
[ 3.525327] EA = 0, S1PTW = 0
[ 3.528476] Data abort info:
[ 3.531359] ISV = 0, ISS = 0x00000044
[ 3.535205] CM = 0, WnR = 1
[ 3.538182] user pgtable: 4k pages, 48-bit VAs, pgdp=00000020f612d000
[ 3.544645] [0000000000000000] pgd=0000000000000000
[ 3.549542] Internal error: Oops: 96000044 [#1] PREEMPT SMP
[ 3.555128] Modules linked in:
[ 3.558189] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.4.0-03552-gfa6e1cd69f80 #1
[ 3.565781] Hardware name: LS1028A RDB Board (DT)
[ 3.570496] pstate: a0000005 (NzCv daif -PAN -UAO)
[ 3.575303] pc : enetc_pf_probe+0x784/0xba8
[ 3.579495] lr : enetc_pf_probe+0x6e8/0xba8
[ 3.583686] sp : ffff80001002ba90
[ 3.587005] x29: ffff80001002ba90 x28: ffff002076130c08
[ 3.592331] x27: 0000000000000002 x26: ffff002076130c80
[ 3.597657] x25: ffff002076130c00 x24: ffff002076130c80
[ 3.602982] x23: ffffb3f2ab0ec000 x22: ffff0020760d7840
[ 3.608307] x21: ffff0020760d7000 x20: ffff002076130c00
[ 3.613632] x19: ffff800010850000 x18: ffffffffffffffff
[ 3.618957] x17: 000000007dee1586 x16: 00000000cb746ba4
[ 3.624282] x15: ffffb3f2abce9908 x14: 0000000000000000
[ 3.629608] x13: 0000000000000101 x12: 0000000000010000
[ 3.634933] x11: 00000000ffffffff x10: ffff4c2dd0136000
[ 3.640257] x9 : 0000000000000000 x8 : ffff002076122000
[ 3.645582] x7 : 0000000000000000 x6 : 000000000000003f
[ 3.650908] x5 : 0000000000000040 x4 : 0000000000000001
[ 3.656234] x3 : ffff800010850000 x2 : ffffb3f2ab0ed868
[ 3.661560] x1 : 0000000000000000 x0 : 00000000051ca556
[ 3.666886] Call trace:
[ 3.669333] enetc_pf_probe+0x784/0xba8
[ 3.673178] local_pci_probe+0x3c/0xa0
[ 3.676935] pci_device_probe+0x128/0x1c0
[ 3.680954] really_probe+0x108/0x348
[ 3.684623] driver_probe_device+0x58/0x100
[ 3.688815] device_driver_attach+0x6c/0x90
[ 3.693006] __driver_attach+0x84/0xc8
[ 3.696762] bus_for_each_dev+0x74/0xc8
[ 3.700605] driver_attach+0x20/0x28
[ 3.704186] bus_add_driver+0x148/0x1f0
[ 3.708029] driver_register+0x60/0x110
[ 3.711872] __pci_register_driver+0x40/0x48
[ 3.716153] enetc_pf_driver_init+0x20/0x28
[ 3.720346] do_one_initcall+0x5c/0x1b0
[ 3.724189] kernel_init_freeable+0x1a4/0x24c
[ 3.728557] kernel_init+0x10/0x108
[ 3.732052] ret_from_fork+0x10/0x18
[ 3.735635] Code: f9400680 f9417ea1 91020000 b9400000 (b9000020)
[ 3.741749] ---[ end trace c8ab43e3d33fed3f ]---
[ 3.746396] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[ 3.748522] ata1: SATA link down (SStatus 0 SControl 300)
[ 3.754077] SMP: stopping secondary CPUs
[ 3.754082] Kernel Offset: 0x33f299c00000 from 0xffff800010000000
[ 3.754083] PHYS_OFFSET: 0xfffff019c0000000
[ 3.754086] CPU features: 0x0002,21806008
[ 3.754088] Memory Limit: none
[ 3.780794] ---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b ]---
As a result of the fix, struct felix allocation also needs to
be converted to managed allocation (devm_alloc).
Fixes: bb849431a970 ("net: dsa: ocelot: alloc memory for dsa switch instance")
Signed-off-by: Claudiu Manoil <claudiu.manoil@nxp.com>
---
drivers/net/dsa/ocelot/felix.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
--- a/drivers/net/dsa/ocelot/felix.c
+++ b/drivers/net/dsa/ocelot/felix.c
@@ -485,7 +485,7 @@ static int felix_pci_probe(struct pci_de
}
}
- felix = kzalloc(sizeof(struct felix), GFP_KERNEL);
+ felix = devm_kzalloc(&pdev->dev, sizeof(*felix), GFP_KERNEL);
if (!felix) {
err = -ENOMEM;
dev_err(&pdev->dev, "Failed to allocate driver memory\n");
@@ -532,11 +532,9 @@ static int felix_pci_probe(struct pci_de
return 0;
err_register_ds:
- kfree(ds);
err_alloc_ds:
err_alloc_irq:
err_alloc_felix:
- kfree(felix);
err_dma:
pci_disable_device(pdev);
err_pci_enable:
@@ -551,9 +549,6 @@ static void felix_pci_remove(struct pci_
dsa_unregister_switch(felix->ds);
- kfree(felix->ds);
- kfree(felix);
-
pci_disable_device(pdev);
}