[PATCHv2 6/7] io_uring: add support for dma pre-mapping
Ammar Faizi
ammarfaizi2 at gnuweeb.org
Tue Aug 2 16:25:14 PDT 2022
On 8/3/22 2:36 AM, Keith Busch wrote:
> From: Keith Busch <kbusch at kernel.org>
>
> Provide a new register operation that can request to pre-map a known
> bvec to the requested fixed file's specific implementation. If
> successful, io_uring will use the returned dma tag for future fixed
> buffer requests to the same file.
>
> Signed-off-by: Keith Busch <kbusch at kernel.org>
[...]
> +static int io_register_map_buffers(struct io_ring_ctx *ctx, void __user *arg)
> +{
> + struct io_uring_map_buffers map;
> + struct io_fixed_file *file_slot;
> + struct file *file;
> + int ret, i;
> +
> + if (!capable(CAP_SYS_ADMIN))
> + return -EPERM;
> +
> + ret = get_map_range(ctx, &map, arg);
> + if (ret < 0)
> + return ret;
> +
> + file_slot = io_fixed_file_slot(&ctx->file_table,
> + array_index_nospec(map.fd, ctx->nr_user_files));
> + if (!file_slot || !file_slot->file_ptr)
> + return -EBADF;
The @file_slot NULL-check doesn't make sense. The definition of
io_fixed_file_slot() is:
static inline struct io_fixed_file *
io_fixed_file_slot(struct io_file_table *table, unsigned i)
{
return &table->files[i];
}
which takes the address of an element in the array. So @file_slot
should never be NULL, if it ever be, something has gone wrong.
If you ever had @ctx->file_table.files being NULL in this path, you
should NULL-check the @->files itself, *not* the return value of
io_fixed_file_slot().
IOW:
...
// NULL check here.
if (!ctx->file_table.files)
return -EBADF;
file_slot = io_fixed_file_slot(&ctx->file_table,
array_index_nospec(map.fd, ctx->nr_user_files));
if (!file_slot->file_ptr)
return -EBADF;
...
> for (i = 0; i < ctx->nr_user_files; i++) {
> - struct file *file = io_file_from_index(&ctx->file_table, i);
> + struct io_fixed_file *f = io_fixed_file_slot(&ctx->file_table, i);
> + struct file *file;
>
> - if (!file)
> + if (!f)
> continue;
The same thing, this @f NULL-check is not needed.
> - if (io_fixed_file_slot(&ctx->file_table, i)->file_ptr & FFS_SCM)
> + if (f->file_ptr & FFS_SCM)
> continue;
> +
> + io_dma_unmap_file(ctx, f);
> + file = io_file_from_fixed(f);
> io_file_bitmap_clear(&ctx->file_table, i);
> fput(file);
> }
--
Ammar Faizi
More information about the Linux-nvme
mailing list