Skip to content

ublk: restore auto buf unregister refcount optimization#519

Open
blktests-ci[bot] wants to merge 18 commits intofor-next_basefrom
series/1048257=>for-next
Open

ublk: restore auto buf unregister refcount optimization#519
blktests-ci[bot] wants to merge 18 commits intofor-next_basefrom
series/1048257=>for-next

Conversation

@blktests-ci
Copy link

@blktests-ci blktests-ci bot commented Jan 29, 2026

Pull request for series with
subject: ublk: restore auto buf unregister refcount optimization
version: 1
url: https://patchwork.kernel.org/project/linux-block/list/?series=1048257

axboe added 13 commits January 27, 2026 11:10
Called when copy_process() is called to copy state to a new child.
Right now this is just a stub, but will be used shortly to properly
handle fork'ing of task based io_uring restrictions.

Reviewed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Currently io_uring supports restricting operations on a per-ring basis.
To use those, the ring must be setup in a disabled state by setting
IORING_SETUP_R_DISABLED. Then restrictions can be set for the ring, and
the ring can then be enabled.

This commit adds support for IORING_REGISTER_RESTRICTIONS with ring_fd
== -1, like the other "blind" register opcodes which work on the task
rather than a specific ring. This allows registration of the same kind
of restrictions as can been done on a specific ring, but with the task
itself. Once done, any ring created will inherit these restrictions.

If a restriction filter is registered with a task, then it's inherited
on fork for its children. Children may only further restrict operations,
not extend them.

Inheriting restrictions include both the classic
IORING_REGISTER_RESTRICTIONS based restrictions, as well as the BPF
filters that have been registered with the task via
IORING_REGISTER_BPF_FILTER.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
* for-7.0/block: (108 commits)
  block: rnull: remove imports available via prelude
  block: remove bio_last_bvec_all
  md raid: fix hang when stopping arrays with metadata through dm-raid
  md-cluster: fix NULL pointer dereference in process_metadata_update
  md/bitmap: fix GPF in write_page caused by resize race
  md/md-llbitmap: fix percpu_ref not resurrected on suspend timeout
  md/raid5: fix IO hang with degraded array with llbitmap
  md: remove recovery_disabled
  md/raid10: cleanup skip handling in raid10_sync_request
  md/raid10: fix any_working flag handling in raid10_sync_request
  md: move finish_reshape to md_finish_sync()
  md: factor out sync completion update into helper
  md: remove MD_RECOVERY_ERROR handling and simplify resync_offset update
  md: update curr_resync_completed even when MD_RECOVERY_INTR is set
  md: mark rdev Faulty when badblocks setting fails
  md: break remaining operations on badblocks set failure in narrow_write_error
  md/raid1,raid10: support narrow_write_error when badblocks is disabled
  md: factor error handling out of md_done_sync into helper
  md/raid1: simplify uptodate handling in end_sync_write
  md/raid5: make sure max_sectors is not less than io_opt
  ...
* for-7.0/io_uring: (25 commits)
  io_uring/rsrc: use GFP_KERNEL_ACCOUNT consistently
  io_uring/futex: use GFP_KERNEL_ACCOUNT for futex data allocation
  io_uring/io-wq: handle !sysctl_hung_task_timeout_secs
  io_uring: fix bad indentation for setup flags if statement
  io_uring/rsrc: take unsigned index in io_rsrc_node_lookup()
  io_uring: introduce non-circular SQ
  io_uring: split out CQ waiting code into wait.c
  io_uring: split out task work code into tw.c
  io_uring/io-wq: don't trigger hung task for syzbot craziness
  io_uring: add IO_URING_EXIT_WAIT_MAX definition
  io_uring/sync: validate passed in offset
  io_uring/eventfd: remove unused ctx->evfd_last_cq_tail member
  io_uring/timeout: annotate data race in io_flush_timeouts()
  io_uring/uring_cmd: explicitly disallow cancelations for IOPOLL
  io_uring: fix IOPOLL with passthrough I/O
  io_uring: track restrictions separately for IORING_OP and IORING_REGISTER
  io_uring: move ctx->restricted check into io_check_restriction()
  io_uring/register: set ctx->restricted when restrictions are parsed
  io_uring/register: have io_parse_restrictions() set restrictions enabled
  io_uring/register: have io_parse_restrictions() return number of ops
  ...
* io_uring-bpf-restrictions.4:
  io_uring: allow registration of per-task restrictions
  io_uring: add task fork hook
  io_uring/bpf_filter: add ref counts to struct io_bpf_filter
  io_uring/bpf_filter: cache lookup table in ctx->bpf_filters
  io_uring/bpf_filter: allow filtering on contents of struct open_how
  io_uring/net: allow filtering on IORING_OP_SOCKET data
  io_uring: add support for BPF filtering for opcode restrictions
Not for upstream, just a merge to help figure out what is going on
with syzbot.

* io_uring-syzbot-cancel:
  io_uring: add debug dumping for when the ring can't exit
* for-7.0/io_uring-zcrx-large-buffers:
  io_uring/zcrx: implement large rx buffer support
  io_uring/zcrx: document area chunking parameter
  selftests: iou-zcrx: test large chunk sizes
  eth: bnxt: support qcfg provided rx page size
  eth: bnxt: adjust the fill level of agg queues with larger buffers
  eth: bnxt: store rx buffer size per queue
  net: pass queue rx page size from memory provider
  net: add bare bone queue configs
  net: reduce indent of struct netdev_queue_mgmt_ops members
  net: memzero mp params when closing a queue
* for-7.0/io_uring:
  io_uring/net: don't continue send bundle if poll was required for retry
* block-6.19:
  Revert "rnbd-clt: fix refcount underflow in device unmap path"
* for-7.0/block:
  rnbd-clt: fix refcount underflow in device unmap path
* for-7.0/block-stable-pages:
  xfs: use bounce buffering direct I/O when the device requires stable pages
  iomap: add a flag to bounce buffer direct I/O
  iomap: support ioends for direct reads
  iomap: rename IOMAP_DIO_DIRTY to IOMAP_DIO_USER_BACKED
  iomap: free the bio before completing the dio
  iomap: share code between iomap_dio_bio_end_io and iomap_finish_ioend_direct
  iomap: split out the per-bio logic from iomap_dio_bio_iter
  iomap: simplify iomap_dio_bio_iter
  iomap: fix submission side handling of completion side errors
  block: add helpers to bounce buffer an iov_iter into bios
  block: remove bio_release_page
  iov_iter: extract a iov_iter_extract_bvecs helper from bio code
  block: open code bio_add_page and fix handling of mismatching P2P ranges
  block: refactor get_contig_folio_len
  block: add a BIO_MAX_SIZE constant and use it
* for-7.0/block:
  block: Replace snprintf with strscpy in check_partition
* block-6.19:
  nvme-pci: DMA unmap the correct regions in nvme_free_sgls
  nvmet: fix race in nvmet_bio_done() leading to NULL pointer dereference
@blktests-ci
Copy link
Author

blktests-ci bot commented Jan 29, 2026

Upstream branch: 4ded82c
series: https://patchwork.kernel.org/project/linux-block/list/?series=1048257
version: 1

* block-6.19:
  bcache: fix I/O accounting leak in detached_dev_do_request
  bcache: remove dead code in detached_dev_do_request
@blktests-ci
Copy link
Author

blktests-ci bot commented Jan 29, 2026

Upstream branch: 1171e38
series: https://patchwork.kernel.org/project/linux-block/list/?series=1048257
version: 1

@blktests-ci blktests-ci bot force-pushed the series/1048257=>for-next branch from ceaabb9 to 648d151 Compare January 29, 2026 09:15
axboe and others added 3 commits January 29, 2026 05:47
* for-7.0/block:
  ublk: document IO reference counting design
* for-7.0/block:
  block: introduce blk_queue_rot()
  block: cleanup queue limit features definition
@blktests-ci
Copy link
Author

blktests-ci bot commented Jan 29, 2026

Upstream branch: d4b7351
series: https://patchwork.kernel.org/project/linux-block/list/?series=1048257
version: 1

@blktests-ci blktests-ci bot force-pushed the series/1048257=>for-next branch from 648d151 to 8236fa6 Compare January 29, 2026 20:23
Commit 1ceeedb ("ublk: optimize UBLK_IO_UNREGISTER_IO_BUF on daemon
task") optimized ublk request buffer unregistration to use a non-atomic
reference count decrement when performed on the ublk_io's daemon task.
The optimization applied to auto buffer unregistration, which happens as
part of handling UBLK_IO_COMMIT_AND_FETCH_REQ on the daemon task.
However, commit b749965 ("ublk: remove ublk_commit_and_fetch()")
reordered the ublk_sub_req_ref() for the completed request before the
io_buffer_unregister_bvec() call. As a result, task_registered_buffers
is already 0 when io_buffer_unregister_bvec() calls ublk_io_release()
and the non-atomic refcount optimization doesn't apply.
Move the io_buffer_unregister_bvec() call back to before
ublk_need_complete_req() to restore the reference counting optimization.

Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
Fixes: b749965 ("ublk: remove ublk_commit_and_fetch()")
Reviewed-by: Ming Lei <ming.lei@redhat.com>
@blktests-ci
Copy link
Author

blktests-ci bot commented Jan 30, 2026

Upstream branch: d4b7351
series: https://patchwork.kernel.org/project/linux-block/list/?series=1048257
version: 1

@blktests-ci blktests-ci bot force-pushed the series/1048257=>for-next branch from 8236fa6 to 85e90e8 Compare January 30, 2026 02:41
@blktests-ci blktests-ci bot force-pushed the for-next_base branch 5 times, most recently from 485086f to 30053cb Compare February 8, 2026 02:55
@blktests-ci
Copy link
Author

blktests-ci bot commented Feb 8, 2026

Upstream branch: 8160585
series: https://patchwork.kernel.org/project/linux-block/list/?series=1048257
version: 1

Pull request is NOT updated. Failed to apply https://patchwork.kernel.org/project/linux-block/list/?series=1048257
error message:

Cmd('git') failed due to: exit code(128)
  cmdline: git am --3way
  stdout: 'Applying: ublk: restore auto buf unregister refcount optimization
Using index info to reconstruct a base tree...
M	drivers/block/ublk_drv.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/block/ublk_drv.c
CONFLICT (content): Merge conflict in drivers/block/ublk_drv.c
Patch failed at 0001 ublk: restore auto buf unregister refcount optimization'
  stderr: 'error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch=diff' to see the failed patch
hint: When you have resolved this problem, run "git am --continue".
hint: If you prefer to skip this patch, run "git am --skip" instead.
hint: To restore the original branch and stop patching, run "git am --abort".
hint: Disable this message with "git config set advice.mergeConflict false"'

conflict:

diff --cc drivers/block/ublk_drv.c
index c13cda58a7c6,f864a0f2f572..000000000000
--- a/drivers/block/ublk_drv.c
+++ b/drivers/block/ublk_drv.c
@@@ -3349,6 -3249,7 +3349,10 @@@ static int ublk_ch_uring_cmd_local(stru
  			io_buffer_unregister_bvec(cmd, buf_idx, issue_flags);
  		compl = ublk_need_complete_req(ub, io);
  
++<<<<<<< HEAD
++=======
+ 		/* can't touch 'ublk_io' any more */
++>>>>>>> ublk: restore auto buf unregister refcount optimization
  		if (req_op(req) == REQ_OP_ZONE_APPEND)
  			req->__sector = addr;
  		if (compl)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants