mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-12 21:44:06 +08:00
2025cf9e19
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms and conditions of the gnu general public license version 2 as published by the free software foundation this program is distributed in the hope it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 263 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190529141901.208660670@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* Copyright (c) 2016 HGST, a Western Digital Company.
|
|
*/
|
|
#include <rdma/ib_verbs.h>
|
|
#include <rdma/mr_pool.h>
|
|
|
|
struct ib_mr *ib_mr_pool_get(struct ib_qp *qp, struct list_head *list)
|
|
{
|
|
struct ib_mr *mr;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&qp->mr_lock, flags);
|
|
mr = list_first_entry_or_null(list, struct ib_mr, qp_entry);
|
|
if (mr) {
|
|
list_del(&mr->qp_entry);
|
|
qp->mrs_used++;
|
|
}
|
|
spin_unlock_irqrestore(&qp->mr_lock, flags);
|
|
|
|
return mr;
|
|
}
|
|
EXPORT_SYMBOL(ib_mr_pool_get);
|
|
|
|
void ib_mr_pool_put(struct ib_qp *qp, struct list_head *list, struct ib_mr *mr)
|
|
{
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&qp->mr_lock, flags);
|
|
list_add(&mr->qp_entry, list);
|
|
qp->mrs_used--;
|
|
spin_unlock_irqrestore(&qp->mr_lock, flags);
|
|
}
|
|
EXPORT_SYMBOL(ib_mr_pool_put);
|
|
|
|
int ib_mr_pool_init(struct ib_qp *qp, struct list_head *list, int nr,
|
|
enum ib_mr_type type, u32 max_num_sg)
|
|
{
|
|
struct ib_mr *mr;
|
|
unsigned long flags;
|
|
int ret, i;
|
|
|
|
for (i = 0; i < nr; i++) {
|
|
mr = ib_alloc_mr(qp->pd, type, max_num_sg);
|
|
if (IS_ERR(mr)) {
|
|
ret = PTR_ERR(mr);
|
|
goto out;
|
|
}
|
|
|
|
spin_lock_irqsave(&qp->mr_lock, flags);
|
|
list_add_tail(&mr->qp_entry, list);
|
|
spin_unlock_irqrestore(&qp->mr_lock, flags);
|
|
}
|
|
|
|
return 0;
|
|
out:
|
|
ib_mr_pool_destroy(qp, list);
|
|
return ret;
|
|
}
|
|
EXPORT_SYMBOL(ib_mr_pool_init);
|
|
|
|
void ib_mr_pool_destroy(struct ib_qp *qp, struct list_head *list)
|
|
{
|
|
struct ib_mr *mr;
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&qp->mr_lock, flags);
|
|
while (!list_empty(list)) {
|
|
mr = list_first_entry(list, struct ib_mr, qp_entry);
|
|
list_del(&mr->qp_entry);
|
|
|
|
spin_unlock_irqrestore(&qp->mr_lock, flags);
|
|
ib_dereg_mr(mr);
|
|
spin_lock_irqsave(&qp->mr_lock, flags);
|
|
}
|
|
spin_unlock_irqrestore(&qp->mr_lock, flags);
|
|
}
|
|
EXPORT_SYMBOL(ib_mr_pool_destroy);
|