mirror of
https://github.com/torvalds/linux.git
synced 2026-05-13 00:28:54 +02:00
Add a configuration of pinned handles on a specific FRMR pool. The configured amount of pinned handles will not be aged and will stay available for users to claim. Upon setting the amount of pinned handles to an FRMR pool, we will make sure we have at least the pinned amount of handles associated with the pool and create more, if necessary. The count for pinned handles take into account handles that are used by user MRs and handles in the queue. Introduce a new FRMR operation of build_key that allows drivers to manipulate FRMR keys supplied by the user, allowing failing for unsupported properties and masking of properties that are modifiable. Signed-off-by: Michael Guralnik <michaelgur@nvidia.com> Reviewed-by: Yishai Hadas <yishaih@nvidia.com> Signed-off-by: Edward Srouji <edwards@nvidia.com> Link: https://patch.msgid.link/20260226-frmr_pools-v4-5-95360b54f15e@nvidia.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
40 lines
1.1 KiB
C
40 lines
1.1 KiB
C
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
|
*
|
|
* Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
*/
|
|
|
|
#ifndef FRMR_POOLS_H
|
|
#define FRMR_POOLS_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/page.h>
|
|
|
|
struct ib_device;
|
|
struct ib_mr;
|
|
|
|
struct ib_frmr_key {
|
|
u64 vendor_key;
|
|
/* A pool with non-zero kernel_vendor_key is a kernel-only pool. */
|
|
u64 kernel_vendor_key;
|
|
size_t num_dma_blocks;
|
|
int access_flags;
|
|
u8 ats:1;
|
|
};
|
|
|
|
struct ib_frmr_pool_ops {
|
|
int (*create_frmrs)(struct ib_device *device, struct ib_frmr_key *key,
|
|
u32 *handles, u32 count);
|
|
void (*destroy_frmrs)(struct ib_device *device, u32 *handles,
|
|
u32 count);
|
|
int (*build_key)(struct ib_device *device, const struct ib_frmr_key *in,
|
|
struct ib_frmr_key *out);
|
|
};
|
|
|
|
int ib_frmr_pools_init(struct ib_device *device,
|
|
const struct ib_frmr_pool_ops *pool_ops);
|
|
void ib_frmr_pools_cleanup(struct ib_device *device);
|
|
int ib_frmr_pool_pop(struct ib_device *device, struct ib_mr *mr);
|
|
int ib_frmr_pool_push(struct ib_device *device, struct ib_mr *mr);
|
|
|
|
#endif /* FRMR_POOLS_H */
|