[PATCH v2 15/25] netfs: Use new folio_queue data type and iterator instead of xarray iter

Leon Romanovsky leon at kernel.org
Tue Sep 24 19:48:09 AEST 2024


On Wed, Aug 14, 2024 at 09:38:35PM +0100, David Howells wrote:
> Make the netfs write-side routines use the new folio_queue struct to hold a
> rolling buffer of folios, with the issuer adding folios at the tail and the
> collector removing them from the head as they're processed instead of using
> an xarray.
> 
> This will allow a subsequent patch to simplify the write collector.
> 
> The primary mark (as tested by folioq_is_marked()) is used to note if the
> corresponding folio needs putting.
> 
> Signed-off-by: David Howells <dhowells at redhat.com>
> cc: Jeff Layton <jlayton at kernel.org>
> cc: netfs at lists.linux.dev
> cc: linux-fsdevel at vger.kernel.org
> ---
>  fs/netfs/internal.h          |  9 +++-
>  fs/netfs/misc.c              | 76 ++++++++++++++++++++++++++++++++
>  fs/netfs/objects.c           |  1 +
>  fs/netfs/stats.c             |  4 +-
>  fs/netfs/write_collect.c     | 84 +++++++++++++++++++-----------------
>  fs/netfs/write_issue.c       | 28 ++++++------
>  include/linux/netfs.h        |  8 ++--
>  include/trace/events/netfs.h |  1 +
>  8 files changed, 150 insertions(+), 61 deletions(-)

According to git bisect, this commit causes to the following kernel
splat during boot of the system with 9p fs.

#
# Caches
#
CONFIG_NETFS_SUPPORT=y
# CONFIG_NETFS_STATS is not set
# CONFIG_NETFS_DEBUG is not set
# CONFIG_FSCACHE is not set
# end of Caches

...
CONFIG_9P_FS=y
...

[    1.510725][    T1] Run /sbin/init as init process
[    1.510937][    T1]   with arguments:
[    1.511060][    T1]     /sbin/init
[    1.511233][    T1]   with environment:
[    1.511332][    T1]     HOME=/
[    1.511448][    T1]     TERM=linux
[    1.516066][    T1] page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x6ce48
[    1.516920][    T1] flags: 0x4000000000000000(zone=1)
[    1.517112][    T1] raw: 4000000000000000 ffffea0001b39248 ffffea00001583c8 0000000000000000
[    1.517374][    T1] raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
[    1.517767][    T1] page dumped because: VM_BUG_ON_FOLIO(((unsigned int) folio_ref_count(folio) + 127u <= 127u))
[    1.518144][    T1] ------------[ cut here ]------------
[    1.518311][    T1] kernel BUG at include/linux/mm.h:1444!
[    1.518488][    T1] Oops: invalid opcode: 0000 [#1] SMP DEBUG_PAGEALLOC KASAN
[    1.518738][    T1] CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.11.0+ #2488
[    1.518990][    T1] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
[    1.519325][    T1] RIP: 0010:__iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.519540][    T1] Code: 84 f2 fa ff ff 48 89 ef e8 49 28 98 ff e9 e5 fa ff ff 48 8d 48 ff e9 2c fe ff ff 48 c7 c6 20 ee 21 83 48 89 cf e8 7c 2d 8a ff <0f> 0b 48 b8 00 00 00 00 00 fc ff df 4c 8b 74 24 68 44 8b 5c 24 30
[    1.520110][    T1] RSP: 0000:ffff8880060f6e40 EFLAGS: 00010286
[    1.520317][    T1] RAX: 000000000000005c RBX: ffffea0001b39234 RCX: 0000000000000000
[    1.520547][    T1] RDX: 000000000000005c RSI: 0000000000000004 RDI: ffffed1000c1edbb
[    1.520776][    T1] RBP: dffffc0000000000 R08: 0000000000000000 R09: fffffbfff0718ce0
[    1.521027][    T1] R10: 0000000000000003 R11: 0000000000000001 R12: ffff8880065bd7e0                                                                                                                                  12:43:45 [122/
[    1.521252][    T1] R13: ffff888006644000 R14: 0000000000000002 R15: 0000000000001000
[    1.521475][    T1] FS:  0000000000000000(0000) GS:ffff88806ce80000(0000) knlGS:0000000000000000
[    1.521761][    T1] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    1.521961][    T1] CR2: 0000000000000000 CR3: 0000000003881001 CR4: 0000000000370eb0
[    1.522200][    T1] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[    1.522418][    T1] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[    1.522636][    T1] Call Trace:
[    1.522750][    T1]  <TASK>
[    1.522823][    T1]  ? __die+0x52/0x8f
[    1.522939][    T1]  ? die+0x2a/0x50
[    1.523061][    T1]  ? do_trap+0x1d9/0x2c0
[    1.523163][    T1]  ? __iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.523334][    T1]  ? do_error_trap+0xa3/0x160
[    1.523465][    T1]  ? __iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.523633][    T1]  ? handle_invalid_op+0x2c/0x30
[    1.523765][    T1]  ? __iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.523942][    T1]  ? exc_invalid_op+0x29/0x40
[    1.524087][    T1]  ? asm_exc_invalid_op+0x16/0x20
[    1.524238][    T1]  ? __iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.524426][    T1]  ? iov_iter_extract_pages+0x1ee0/0x1ee0
[    1.524575][    T1]  ? radix_tree_node_alloc.constprop.0+0x16a/0x2c0
[    1.524762][    T1]  ? lock_acquire+0xe2/0x500
[    1.524916][    T1]  ? mark_lock+0xfc/0x2dc0
[    1.525071][    T1]  iov_iter_get_pages_alloc2+0x3d/0xe0
[    1.525208][    T1]  ? print_usage_bug.part.0+0x600/0x600
[    1.525392][    T1]  p9_get_mapped_pages.part.0.constprop.0+0x3bf/0x6c0
[    1.525595][    T1]  ? p9pdu_vwritef+0x320/0x1f20
[    1.525756][    T1]  ? p9_virtio_request+0x550/0x550
[    1.525918][    T1]  ? pdu_read+0xc0/0xc0
[    1.526056][    T1]  ? lock_release+0x220/0x780
[    1.526218][    T1]  ? pdu_read+0xc0/0xc0
[    1.526341][    T1]  p9_virtio_zc_request+0x728/0x1020
[    1.526501][    T1]  ? p9pdu_vwritef+0x320/0x1f20
[    1.526662][    T1]  ? p9_virtio_probe+0xa20/0xa20
[    1.526824][    T1]  ? netfs_read_to_pagecache+0x601/0xd50
[    1.526990][    T1]  ? mark_lock+0xfc/0x2dc0
[    1.527159][    T1]  ? p9pdu_finalize+0xdc/0x1d0
[    1.527321][    T1]  ? p9_client_prepare_req+0x235/0x360
[    1.527483][    T1]  ? p9_tag_alloc+0x6e0/0x6e0
[    1.527644][    T1]  ? lock_release+0x220/0x780
[    1.527806][    T1]  p9_client_zc_rpc.constprop.0+0x236/0x7d0
[    1.528013][    T1]  ? __create_object+0x5e/0x80
[    1.528175][    T1]  ? p9_client_flush.isra.0+0x390/0x390
[    1.528345][    T1]  ? lockdep_hardirqs_on_prepare+0x268/0x3e0
[    1.528544][    T1]  ? __call_rcu_common.constprop.0+0x475/0xc80
[    1.528785][    T1]  ? p9_req_put+0x17a/0x200
[    1.528944][    T1]  p9_client_read_once+0x343/0x840
[    1.529114][    T1]  ? p9_client_getlock_dotl+0x3c0/0x3c0
[    1.529274][    T1]  p9_client_read+0xf1/0x150
[    1.529440][    T1]  v9fs_issue_read+0x107/0x2c0
[    1.529608][    T1]  ? v9fs_issue_write+0x140/0x140
[    1.529736][    T1]  netfs_read_to_pagecache+0x601/0xd50
[    1.529858][    T1]  netfs_readahead+0x6af/0xbe0
[    1.530000][    T1]  read_pages+0x17b/0xaf0
[    1.530136][    T1]  ? lru_move_tail+0x8f0/0x8f0
[    1.530299][    T1]  ? file_ra_state_init+0xd0/0xd0
[    1.530479][    T1]  page_cache_ra_unbounded+0x324/0x5f0
[    1.530638][    T1]  filemap_get_pages+0x597/0x16b0
[    1.530801][    T1]  ? filemap_add_folio+0x140/0x140
[    1.530957][    T1]  ? lock_is_held_type+0x81/0xe0
[    1.531121][    T1]  filemap_read+0x2ec/0xa90
[    1.531282][    T1]  ? filemap_get_pages+0x16b0/0x16b0
[    1.531443][    T1]  ? 0xffffffff81000000
[    1.531565][    T1]  ? find_held_lock+0x2d/0x110
[    1.531720][    T1]  ? lock_is_held_type+0x81/0xe0
[    1.531888][    T1]  ? down_read_interruptible+0x1f6/0x490
[    1.532062][    T1]  ? down_read+0x450/0x450
[    1.532229][    T1]  ? lockdep_hardirqs_on_prepare+0x3e0/0x3e0
[    1.532435][    T1]  ? find_held_lock+0x2d/0x110
[    1.532594][    T1]  netfs_buffered_read_iter+0xe2/0x130
[    1.532755][    T1]  ? netfs_file_read_iter+0xb2/0x130
[    1.532904][    T1]  __kernel_read+0x2db/0x8a0
[    1.533066][    T1]  ? __x64_sys_lseek+0x1d0/0x1d0
[    1.533221][    T1]  bprm_execve+0x548/0x1410
[    1.533381][    T1]  ? setup_arg_pages+0xb40/0xb40
[    1.533534][    T1]  ? __cond_resched+0x17/0x70
[    1.533684][    T1]  kernel_execve+0x26a/0x2f0
[    1.533808][    T1]  try_to_run_init_process+0xf/0x30
[    1.533933][    T1]  ? rest_init+0x1b0/0x1b0
[    1.534064][    T1]  kernel_init+0xe2/0x140
[    1.534160][    T1]  ? _raw_spin_unlock_irq+0x24/0x30
[    1.534285][    T1]  ret_from_fork+0x2d/0x70
[    1.534415][    T1]  ? rest_init+0x1b0/0x1b0
[    1.534558][    T1]  ret_from_fork_asm+0x11/0x20
[    1.534730][    T1]  </TASK>
[    1.534858][    T1] Modules linked in:
[    1.535016][    T1] ---[ end trace 0000000000000000 ]---
[    1.535173][    T1] RIP: 0010:__iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.535385][    T1] Code: 84 f2 fa ff ff 48 89 ef e8 49 28 98 ff e9 e5 fa ff ff 48 8d 48 ff e9 2c fe ff ff 48 c7 c6 20 ee 21 83 48 89 cf e8 7c 2d 8a ff <0f> 0b 48 b8 00 00 00 00 00 fc ff df 4c 8b 74 24 68 44 8b 5c 24 30
[    1.535967][    T1] RSP: 0000:ffff8880060f6e40 EFLAGS: 00010286
[    1.536183][    T1] RAX: 000000000000005c RBX: ffffea0001b39234 RCX: 0000000000000000
[    1.536426][    T1] RDX: 000000000000005c RSI: 0000000000000004 RDI: ffffed1000c1edbb
[    1.536667][    T1] RBP: dffffc0000000000 R08: 0000000000000000 R09: fffffbfff0718ce0
[    1.536914][    T1] R10: 0000000000000003 R11: 0000000000000001 R12: ffff8880065bd7e0
[    1.537163][    T1] R13: ffff888006644000 R14: 0000000000000002 R15: 0000000000001000
[    1.537409][    T1] FS:  0000000000000000(0000) GS:ffff88806ce80000(0000) knlGS:0000000000000000
[    1.537842][    T1] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    1.538035][    T1] CR2: 0000000000000000 CR3: 0000000003881001 CR4: 0000000000370eb0
[    1.538281][    T1] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[    1.538519][    T1] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[    1.538779][    T1] ------------[ cut here ]------------
[    1.538904][    T1] WARNING: CPU: 1 PID: 1 at kernel/exit.c:886 do_exit+0x17c4/0x23a0
[    1.539110][    T1] Modules linked in:
[    1.539229][    T1] CPU: 1 UID: 0 PID: 1 Comm: swapper/0 Tainted: G      D            6.11.0+ #2488
[    1.539459][    T1] Tainted: [D]=DIE
[    1.539567][    T1] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
[    1.539860][    T1] RIP: 0010:do_exit+0x17c4/0x23a0
[    1.540008][    T1] Code: bb 68 04 00 00 31 f6 e8 5a 92 ff ff e9 d6 f8 ff ff 4c 89 fe bf 05 06 00 00 e8 c8 53 02 00 e9 5c ec ff ff 0f 0b e9 b7 e8 ff ff <0f> 0b e9 27 ea ff ff 48 89 df e8 ad 90 ff ff 48 85 c0 49 89 c7 0f
[    1.540502][    T1] RSP: 0000:ffff8880060f7e68 EFLAGS: 00010286
[    1.540657][    T1] RAX: dffffc0000000000 RBX: ffff8880060e8000 RCX: 1ffffffff07aebdf
[    1.540860][    T1] RDX: 1ffff11000c1d20b RSI: 0000000000000008 RDI: ffff8880060e9058
[    1.541078][    T1] RBP: ffff8880060e8708 R08: 0000000000000000 R09: fffffbfff07ae5c1
[    1.541261][    T1] R10: 0000000000000000 R11: 0000000000000001 R12: ffff888006108000
[    1.541437][    T1] R13: ffff8880060e8710 R14: ffff888006100000 R15: 000000000000000b
[    1.541645][    T1] FS:  0000000000000000(0000) GS:ffff88806ce80000(0000) knlGS:0000000000000000
[    1.541875][    T1] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[    1.542043][    T1] CR2: 0000000000000000 CR3: 0000000003881001 CR4: 0000000000370eb0
[    1.542237][    T1] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[    1.542432][    T1] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
[    1.542622][    T1] Call Trace:
[    1.542733][    T1]  <TASK>
[    1.542801][    T1]  ? __warn.cold+0x5f/0x1ed
[    1.542930][    T1]  ? do_exit+0x17c4/0x23a0
[    1.543063][    T1]  ? report_bug+0x1e6/0x290
[    1.543190][    T1]  ? handle_bug+0x4f/0x90
[    1.543290][    T1]  ? exc_invalid_op+0x13/0x40
[    1.543418][    T1]  ? asm_exc_invalid_op+0x16/0x20
[    1.543545][    T1]  ? do_exit+0x17c4/0x23a0
[    1.543676][    T1]  ? do_exit+0x1c2/0x23a0
[    1.543774][    T1]  ? __cond_resched+0x17/0x70
[    1.543904][    T1]  ? is_current_pgrp_orphaned+0x90/0x90
[    1.544040][    T1]  ? kernel_execve+0x26a/0x2f0
[    1.544169][    T1]  ? __iov_iter_get_pages_alloc+0x16d4/0x2210
[    1.544329][    T1]  make_task_dead+0xf0/0x110
[    1.544462][    T1]  rewind_stack_and_make_dead+0x16/0x20
[    1.544595][    T1] RIP: 0000:0x0
[    1.544708][    T1] Code: Unable to access opcode bytes at 0xffffffffffffffd6.
[    1.544903][    T1] RSP: 0000:0000000000000000 EFLAGS: 00000000 ORIG_RAX: 0000000000000000
[    1.545098][    T1] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000
[    1.545286][    T1] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000
[    1.545489][    T1] RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
[    1.545699][    T1] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
[    1.545898][    T1] R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
[    1.546099][    T1]  </TASK>
[    1.546198][    T1] Kernel panic - not syncing: kernel: panic_on_warn set ...
[    1.546654][    T1] Kernel Offset: disabled
[    1.546769][    T1] ---[ end Kernel panic - not syncing: kernel: panic_on_warn set ... ]---

Thanks


More information about the Linux-erofs mailing list