projects
/
linux-2.6-microblaze.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
96b3bb1
)
Add exception protection processing for vd in axi_chan_handle_err function
author
Shawn.Shao
<shawn.shao@jaguarmicro.com>
Thu, 12 Jan 2023 05:58:02 +0000
(13:58 +0800)
committer
Vinod Koul
<vkoul@kernel.org>
Wed, 18 Jan 2023 11:57:30 +0000
(17:27 +0530)
Since there is no protection for vd, a kernel panic will be
triggered here in exceptional cases.
You can refer to the processing of axi_chan_block_xfer_complete function
The triggered kernel panic is as follows:
[ 67.848444] Unable to handle kernel NULL pointer dereference at virtual address
0000000000000060
[ 67.848447] Mem abort info:
[ 67.848449] ESR = 0x96000004
[ 67.848451] EC = 0x25: DABT (current EL), IL = 32 bits
[ 67.848454] SET = 0, FnV = 0
[ 67.848456] EA = 0, S1PTW = 0
[ 67.848458] Data abort info:
[ 67.848460] ISV = 0, ISS = 0x00000004
[ 67.848462] CM = 0, WnR = 0
[ 67.848465] user pgtable: 4k pages, 48-bit VAs, pgdp=
00000800c4c0b000
[ 67.848468] [
0000000000000060
] pgd=
0000000000000000
, p4d=
0000000000000000
[ 67.848472] Internal error: Oops:
96000004
[#1] SMP
[ 67.848475] Modules linked in: dmatest
[ 67.848479] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.10.100-emu_x2rc+ #11
[ 67.848483] pstate:
62000085
(nZCv daIf -PAN -UAO +TCO BTYPE=--)
[ 67.848487] pc : axi_chan_handle_err+0xc4/0x230
[ 67.848491] lr : axi_chan_handle_err+0x30/0x230
[ 67.848493] sp :
ffff0803fe55ae50
[ 67.848495] x29:
ffff0803fe55ae50
x28:
ffff800011212200
[ 67.848500] x27:
ffff0800c42c0080
x26:
ffff0800c097c080
[ 67.848504] x25:
ffff800010d33880
x24:
ffff80001139d850
[ 67.848508] x23:
ffff0800c097c168
x22:
0000000000000000
[ 67.848512] x21:
0000000000000080
x20:
0000000000002000
[ 67.848517] x19:
ffff0800c097c080
x18:
0000000000000000
[ 67.848521] x17:
0000000000000000
x16:
0000000000000000
[ 67.848525] x15:
0000000000000000
x14:
0000000000000000
[ 67.848529] x13:
0000000000000000
x12:
0000000000000040
[ 67.848533] x11:
ffff0800c0400248
x10:
ffff0800c040024a
[ 67.848538] x9 :
ffff800010576cd4
x8 :
ffff0800c0400270
[ 67.848542] x7 :
0000000000000000
x6 :
ffff0800c04003e0
[ 67.848546] x5 :
ffff0800c0400248
x4 :
ffff0800c4294480
[ 67.848550] x3 :
dead000000000100
x2 :
dead000000000122
[ 67.848555] x1 :
0000000000000100
x0 :
ffff0800c097c168
[ 67.848559] Call trace:
[ 67.848562] axi_chan_handle_err+0xc4/0x230
[ 67.848566] dw_axi_dma_interrupt+0xf4/0x590
[ 67.848569] __handle_irq_event_percpu+0x60/0x220
[ 67.848573] handle_irq_event+0x64/0x120
[ 67.848576] handle_fasteoi_irq+0xc4/0x220
[ 67.848580] __handle_domain_irq+0x80/0xe0
[ 67.848583] gic_handle_irq+0xc0/0x138
[ 67.848585] el1_irq+0xc8/0x180
[ 67.848588] arch_cpu_idle+0x14/0x2c
[ 67.848591] default_idle_call+0x40/0x16c
[ 67.848594] do_idle+0x1f0/0x250
[ 67.848597] cpu_startup_entry+0x2c/0x60
[ 67.848600] rest_init+0xc0/0xcc
[ 67.848603] arch_call_rest_init+0x14/0x1c
[ 67.848606] start_kernel+0x4cc/0x500
[ 67.848610] Code:
eb0002ff
9a9f12d6
f2fbd5a2
f2fbd5a3
(
a94602c1
)
[ 67.848613] ---[ end trace
585a97036f88203a
]---
Signed-off-by: Shawn.Shao <shawn.shao@jaguarmicro.com>
Cc: stable@vger.kernel.org
Link:
https://lore.kernel.org/r/20230112055802.1764-1-shawn.shao@jaguarmicro.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
patch
|
blob
|
history
diff --git
a/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
b/drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
index
a183d93
..
bf85aa0
100644
(file)
--- a/
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
+++ b/
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
@@
-1018,6
+1018,11
@@
static noinline void axi_chan_handle_err(struct axi_dma_chan *chan, u32 status)
/* The bad descriptor currently is in the head of vc list */
vd = vchan_next_desc(&chan->vc);
+ if (!vd) {
+ dev_err(chan2dev(chan), "BUG: %s, IRQ with no descriptors\n",
+ axi_chan_name(chan));
+ goto out;
+ }
/* Remove the completed descriptor from issued list */
list_del(&vd->node);
@@
-1032,6
+1037,7
@@
static noinline void axi_chan_handle_err(struct axi_dma_chan *chan, u32 status)
/* Try to restart the controller */
axi_chan_start_first_queued(chan);
+out:
spin_unlock_irqrestore(&chan->vc.lock, flags);
}