lkml.org 
[lkml]   [2022]   [Mar]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: [PATCH 4/5] block: turn bio_kmalloc into a simple kmalloc wrapper
From
Hi Christoph,

On 08.03.2022 07:15, Christoph Hellwig wrote:
> Remove the magic autofree semantics and require the callers to explicitly
> call bio_init to initialize the bio.
>
> This allows bio_free to catch accidental bio_put calls on bio_init()ed
> bios as well.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

This patch, which landed in today's next-20220331 as commit 57c47b42f454
("block: turn bio_kmalloc into a simple kmalloc wrapper"), breaks badly
all my test systems, which use squashfs initrd:

RAMDISK: squashfs filesystem found at block 0
RAMDISK: Loading 2489KiB [1 disk] into ram disk... done.
using deprecated initrd support, will be removed in 2021.
------------[ cut here ]------------
WARNING: CPU: 4 PID: 1 at block/bio.c:229 bio_free+0x6c/0x70
Modules linked in:
CPU: 4 PID: 1 Comm: swapper/0 Not tainted 5.17.0-next-20220331 #4767
Hardware name: Samsung Exynos (Flattened Device Tree)
 unwind_backtrace from show_stack+0x10/0x14
 show_stack from dump_stack_lvl+0x58/0x70
 dump_stack_lvl from __warn+0xc8/0x218
 __warn from warn_slowpath_fmt+0x5c/0xb4
 warn_slowpath_fmt from bio_free+0x6c/0x70
 bio_free from squashfs_read_data+0x118/0x748
 squashfs_read_data from squashfs_read_table+0xdc/0x144
 squashfs_read_table from squashfs_fill_super+0x100/0x9ec
 squashfs_fill_super from get_tree_bdev+0x154/0x248
 get_tree_bdev from vfs_get_tree+0x24/0xe4
 vfs_get_tree from path_mount+0x3d0/0xb14
 path_mount from init_mount+0x54/0x80
 init_mount from do_mount_root+0x78/0x104
 do_mount_root from mount_block_root+0xf0/0x1fc
 mount_block_root from initrd_load+0xec/0x294
 initrd_load from prepare_namespace+0xdc/0x18c
 prepare_namespace from kernel_init+0x18/0x12c
 kernel_init from ret_from_fork+0x14/0x2c
Exception stack(0xf0835fb0 to 0xf0835ff8)
...
irq event stamp: 398271
hardirqs last  enabled at (398279): [<c019c984>] __up_console_sem+0x50/0x60
hardirqs last disabled at (398338): [<c019c970>] __up_console_sem+0x3c/0x60
softirqs last  enabled at (398352): [<c0101680>] __do_softirq+0x348/0x610
softirqs last disabled at (398347): [<c012f048>] __irq_exit_rcu+0x144/0x1ec
---[ end trace 0000000000000000 ]---
8<--- cut here ---
Unable to handle kernel NULL pointer dereference at virtual address 00000004
[00000004] *pgd=00000000
Internal error: Oops: 5 [#1] PREEMPT SMP ARM
Modules linked in:
CPU: 4 PID: 1 Comm: swapper/0 Tainted: G        W 5.17.0-next-20220331 #4767
Hardware name: Samsung Exynos (Flattened Device Tree)
PC is at bio_free+0x24/0x70
LR is at bio_free+0x24/0x70
pc : [<c0502d28>]    lr : [<c0502d28>]    psr: 80000113
sp : f0835cf0  ip : 00000000  fp : c28cae80
r10: ef0a95c0  r9 : c2805cc0  r8 : 00000060
r7 : 00000060  r6 : 00000060  r5 : 00000000  r4 : c2804a80
r3 : c2804ac8  r2 : 00000001  r1 : c2804ac8  r0 : 00000074
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
Control: 10c5387d  Table: 4000406a  DAC: 00000051
Register r0 information: non-paged memory
Register r1 information: slab kmalloc-128 start c2804a80 pointer offset
72 size 128
Register r2 information: non-paged memory
Register r3 information: slab kmalloc-128 start c2804a80 pointer offset
72 size 128
Register r4 information: slab kmalloc-128 start c2804a80 pointer offset
0 size 128
Register r5 information: NULL pointer
Register r6 information: non-paged memory
Register r7 information: non-paged memory
Register r8 information: non-paged memory
Register r9 information: slab kmalloc-192 start c2805cc0 pointer offset
0 size 192
Register r10 information: non-slab/vmalloc memory
Register r11 information: slab kmalloc-64 start c28cae80 pointer offset
0 size 64
Register r12 information: NULL pointer
Process swapper/0 (pid: 1, stack limit = 0x(ptrval))
Stack: (0xf0835cf0 to 0xf0836000)
...
 bio_free from squashfs_read_data+0x118/0x748
 squashfs_read_data from squashfs_read_table+0xdc/0x144
 squashfs_read_table from squashfs_fill_super+0x100/0x9ec
 squashfs_fill_super from get_tree_bdev+0x154/0x248
 get_tree_bdev from vfs_get_tree+0x24/0xe4
 vfs_get_tree from path_mount+0x3d0/0xb14
 path_mount from init_mount+0x54/0x80
 init_mount from do_mount_root+0x78/0x104
 do_mount_root from mount_block_root+0xf0/0x1fc
 mount_block_root from initrd_load+0xec/0x294
 initrd_load from prepare_namespace+0xdc/0x18c
 prepare_namespace from kernel_init+0x18/0x12c
 kernel_init from ret_from_fork+0x14/0x2c
Exception stack(0xf0835fb0 to 0xf0835ff8)
...
---[ end trace 0000000000000000 ]---
Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b

Reverting it on top of linux next-20220331 (together with commit
1292fb59f283 ("pktcdvd: stop using bio_reset")) fixes (or hides?) the issue.

> ---
> block/bio.c | 47 ++++++++++++------------------
> block/blk-crypto-fallback.c | 14 +++++----
> block/blk-map.c | 42 ++++++++++++++++----------
> drivers/block/pktcdvd.c | 25 ++++++++--------
> drivers/md/bcache/debug.c | 10 ++++---
> drivers/md/dm-bufio.c | 9 +++---
> drivers/md/raid1.c | 12 +++++---
> drivers/md/raid10.c | 21 ++++++++-----
> drivers/target/target_core_pscsi.c | 10 +++----
> fs/squashfs/block.c | 9 +++---
> include/linux/bio.h | 2 +-
> 11 files changed, 108 insertions(+), 93 deletions(-)

> [...]

Best regards
--
Marek Szyprowski, PhD
Samsung R&D Institute Poland

\
 
 \ /
  Last update: 2022-03-31 23:19    [W:0.131 / U:0.752 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site