Files
linux-stable-mirror/drivers/infiniband/core/frmr_pools.h
T
Michael GuralnikandLeon Romanovsky d2ea675e86 RDMA/core: Add netlink command to modify FRMR aging
Allow users to set FRMR pools aging timer through netlink.
This functionality will allow user to control how long handles reside in
the kernel before being destroyed, thus being able to tune the tradeoff
between memory and HW object consumption and memory registration
optimization.
Since FRMR pools is highly beneficial for application restart scenarios,
this command allows users to modify the aging timer to their application
restart time, making sure the FRMR handles deregistered on application
teardown are kept for long enough in the pools for reuse in the
application startup.

Signed-off-by: Michael Guralnik <michaelgur@nvidia.com>
Reviewed-by: Patrisious Haddad <phaddad@nvidia.com>
Signed-off-by: Edward Srouji <edwards@nvidia.com>
Link: https://patch.msgid.link/20260226-frmr_pools-v4-9-95360b54f15e@nvidia.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
2026-03-02 13:45:37 -05:00

64 lines
1.5 KiB
C

/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
*
* Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
*/
#ifndef RDMA_CORE_FRMR_POOLS_H
#define RDMA_CORE_FRMR_POOLS_H
#include <rdma/frmr_pools.h>
#include <linux/rbtree_types.h>
#include <linux/spinlock_types.h>
#include <linux/types.h>
#include <asm/page.h>
#include <linux/workqueue.h>
#define NUM_HANDLES_PER_PAGE \
((PAGE_SIZE - sizeof(struct list_head)) / sizeof(u32))
struct frmr_handles_page {
struct list_head list;
u32 handles[NUM_HANDLES_PER_PAGE];
};
/* FRMR queue holds a list of frmr_handles_page.
* num_pages: number of pages in the queue.
* ci: current index in the handles array across all pages.
*/
struct frmr_queue {
struct list_head pages_list;
u32 num_pages;
unsigned long ci;
};
struct ib_frmr_pool {
struct rb_node node;
struct ib_frmr_key key; /* Pool key */
/* Protect access to the queue */
spinlock_t lock;
struct frmr_queue queue;
struct frmr_queue inactive_queue;
struct delayed_work aging_work;
struct ib_device *device;
u32 max_in_use;
u32 in_use;
u32 pinned_handles;
};
struct ib_frmr_pools {
struct rb_root rb_root;
rwlock_t rb_lock;
const struct ib_frmr_pool_ops *pool_ops;
struct workqueue_struct *aging_wq;
u32 aging_period_sec;
};
int ib_frmr_pools_set_pinned(struct ib_device *device, struct ib_frmr_key *key,
u32 pinned_handles);
int ib_frmr_pools_set_aging_period(struct ib_device *device, u32 period_sec);
#endif /* RDMA_CORE_FRMR_POOLS_H */