InfiniBand 和遠端 DMA (RDMA) 介面

簡介和概述

待定

InfiniBand 核心介面

struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq, u8 nl_client, gfp_t gfp)

分配和初始化 netlink 訊息請求

引數

__u32 nlmsg_seq

netlink 訊息的序列號

u8 nl_client

netlink 客戶端的索引

gfp_t gfp

指示如何分配請求的記憶體

描述

如果成功,則返回新分配的 netlink 請求物件,否則返回 NULL

void iwpm_free_nlmsg_request(struct kref *kref)

釋放 netlink 訊息請求

引數

struct kref *kref

儲存 netlink 訊息請求的引用

struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq)

在請求列表中查詢 netlink 訊息請求

引數

__u32 echo_seq

要查詢的 netlink 請求的序列號

描述

返回找到的 netlink 訊息請求,如果未找到,則返回 NULL

int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request)

在處理 netlink 請求時阻塞

引數

struct iwpm_nlmsg_request *nlmsg_request

要處理的 Netlink 訊息請求

描述

請求完成後或過期後喚醒 如果請求在沒有錯誤的情況下完成,則返回 0

int iwpm_get_nlmsg_seq(void)

獲取要傳送到埠對映器的 netlink 訊息的序列號

引數

void

無引數

描述

返回 netlink 訊息的序列號。

void iwpm_add_remote_info(struct iwpm_remote_info *reminfo)

將連線對等方的遠端地址資訊新增到遠端資訊雜湊表中

引數

struct iwpm_remote_info *reminfo

要新增的遠端資訊

u32 iwpm_check_registration(u8 nl_client, u32 reg)

檢查客戶端註冊是否與給定的註冊匹配

引數

u8 nl_client

netlink 客戶端的索引

u32 reg

要比較的給定註冊型別

描述

呼叫 iwpm_register_pid() 註冊客戶端 如果客戶端註冊與 reg 匹配,則返回 true,否則返回 false

void iwpm_set_registration(u8 nl_client, u32 reg)

設定客戶端註冊

引數

u8 nl_client

netlink 客戶端的索引

u32 reg

要設定的註冊型別

u32 iwpm_get_registration(u8 nl_client)

獲取客戶端註冊

引數

u8 nl_client

netlink 客戶端的索引

描述

返回客戶端註冊型別

int iwpm_send_mapinfo(u8 nl_client, int iwpm_pid)

將客戶端的本地和對映的 IPv4/IPv6 地址資訊傳送到使用者空間埠對映器

引數

u8 nl_client

netlink 客戶端的索引

int iwpm_pid

使用者空間埠對映器的 pid

描述

如果成功,則返回傳送的對映資訊記錄數

int iwpm_mapinfo_available(void)

檢查雜湊表中是否有任何對映資訊記錄可用

引數

void

無引數

描述

如果對映資訊可用,則返回 1,否則返回 0

int iwpm_compare_sockaddr(struct sockaddr_storage *a_sockaddr, struct sockaddr_storage *b_sockaddr)

比較兩個 sockaddr storage 結構

引數

struct sockaddr_storage *a_sockaddr

要比較的第一個 sockaddr

struct sockaddr_storage *b_sockaddr

要比較的第二個 sockaddr

返回

如果它們持有相同的 ip/tcp 地址資訊,則返回 0,否則返回 1

int iwpm_validate_nlmsg_attr(struct nlattr *nltb[], int nla_count)

檢查 NULL netlink 屬性

引數

struct nlattr *nltb[]

儲存每個 netlink 訊息屬性的地址

int nla_count

netlink 訊息屬性的數量

描述

如果任何 nla_count 屬性為 NULL,則返回錯誤

struct sk_buff *iwpm_create_nlmsg(u32 nl_op, struct nlmsghdr **nlh, int nl_client)

分配 skb 並形成 netlink 訊息

引數

u32 nl_op

Netlink 訊息操作碼

struct nlmsghdr **nlh

儲存 skb 中 netlink 訊息頭的地址

int nl_client

netlink 客戶端的索引

描述

返回新分配的 skb,如果 skb 的尾部空間不足以儲存訊息頭和有效負載,則返回 NULL

int iwpm_parse_nlmsg(struct netlink_callback *cb, int policy_max, const struct nla_policy *nlmsg_policy, struct nlattr *nltb[], const char *msg_type)

驗證和解析收到的 netlink 訊息

引數

struct netlink_callback *cb

Netlink 回撥結構

int policy_max

期望的最大屬性型別

const struct nla_policy *nlmsg_policy

驗證策略

struct nlattr *nltb[]

用於儲存 policy_max 解析元素的陣列

const char *msg_type

netlink 訊息型別

描述

成功時返回 0 或負錯誤程式碼

void iwpm_print_sockaddr(struct sockaddr_storage *sockaddr, char *msg)

列印 IPv4/IPv6 地址和 TCP 埠

引數

struct sockaddr_storage *sockaddr

要列印的套接字地址

char *msg

要列印的訊息

int iwpm_send_hello(u8 nl_client, int iwpm_pid, u16 abi_version)

向 iwpmd 傳送 hello 響應

引數

u8 nl_client

netlink 客戶端的索引

int iwpm_pid

使用者空間埠對映器的 pid

u16 abi_version

核心的 abi_version

描述

成功時返回 0 或負錯誤程式碼

int ib_process_cq_direct(struct ib_cq *cq, int budget)

在呼叫方上下文中處理 CQ

引數

struct ib_cq *cq

要處理的 CQ

int budget

要輪詢的 CQE 的數量

描述

此函式用於處理所有未完成的 CQ 條目。它不會將 CQ 處理解除安裝到其他上下文,也不會請求 HCA 發出完成中斷。使用非 IB_POLL_DIRECT 型別的 CQ 進行直接處理可能會觸發併發處理。

注意

除非可以保證將被處理的完成數量很小,否則不要將 budget 傳遞 -1。

struct ib_cq *__ib_alloc_cq(struct ib_device *dev, void *private, int nr_cqe, int comp_vector, enum ib_poll_context poll_ctx, const char *caller)

分配一個完成佇列

引數

struct ib_device *dev

用於分配 CQ 的裝置

void *private

驅動程式私有資料,可以從 cq->cq_context 訪問

int nr_cqe

要分配的 CQE 數量

int comp_vector

此 CQ 的 HCA 完成向量

enum ib_poll_context poll_ctx

從中輪詢 CQ 的上下文。

const char *caller

模組所有者名稱。

描述

這是為核心使用者分配 CQ 的正確介面。使用此介面分配的 CQ 將自動從指定的上下文中輪詢。 ULP 必須使用 wr->wr_cqe 而不是 wr->wr_id 才能使用此 CQ 抽象。

struct ib_cq *__ib_alloc_cq_any(struct ib_device *dev, void *private, int nr_cqe, enum ib_poll_context poll_ctx, const char *caller)

分配一個完成佇列

引數

struct ib_device *dev

用於分配 CQ 的裝置

void *private

驅動程式私有資料,可以從 cq->cq_context 訪問

int nr_cqe

要分配的 CQE 數量

enum ib_poll_context poll_ctx

從中輪詢 CQ 的上下文

const char *caller

模組所有者名稱

描述

嘗試將 ULP 完成佇列分散到每個裝置的中斷向量上。 使用了一種簡單的盡力而為機制。

void ib_free_cq(struct ib_cq *cq)

釋放一個完成佇列

引數

struct ib_cq *cq

要釋放的完成佇列。

struct ib_cq *ib_cq_pool_get(struct ib_device *dev, unsigned int nr_cqe, int comp_vector_hint, enum ib_poll_context poll_ctx)

查詢與給定的 cpu 提示匹配(或萬用字元關聯的最小使用量)並且適合 nr_cqe 的最小使用的完成佇列。

引數

struct ib_device *dev

rdma 裝置

unsigned int nr_cqe

所需的 cqe 條目數

int comp_vector_hint

完成向量提示 (-1),驅動程式根據內部計數器分配一個完成向量

enum ib_poll_context poll_ctx

cq 輪詢上下文

描述

查詢滿足 comp_vector_hintnr_cqe 要求的 cq,並在其中宣告我們的條目。 如果沒有可用的 cq,則分配一個新的具有要求的 cq 並將其新增到裝置池。 IB_POLL_DIRECT 不能用於共享 cqs,因此它不是 poll_ctx 的有效值。

void ib_cq_pool_put(struct ib_cq *cq, unsigned int nr_cqe)

返回從共享池中獲取的 CQ。

引數

struct ib_cq *cq

要返回的 CQ。

unsigned int nr_cqe

使用者請求的最大 cqe 數。

int ib_cm_listen(struct ib_cm_id *cm_id, __be64 service_id)

啟動偵聽指定的服務 ID,以進行連線和服務 ID 解析請求。

引數

struct ib_cm_id *cm_id

與偵聽請求關聯的連線識別符號。

__be64 service_id

與傳入連線和服務 ID 解析請求匹配的服務識別符號。 服務 ID 應以網路位元組順序指定。 如果設定為 IB_CM_ASSIGN_SERVICE_ID,則 CM 將為呼叫者分配一個服務 ID。

struct ib_cm_id *ib_cm_insert_listen(struct ib_device *device, ib_cm_handler cm_handler, __be64 service_id)

建立一個新的偵聽 ib_cm_id 並偵聽給定的服務 ID。

引數

struct ib_device *device

與 cm_id 關聯的裝置。 所有相關的通訊將與指定的裝置相關聯。

ib_cm_handler cm_handler

呼叫以通知使用者 CM 事件的回撥。

__be64 service_id

與傳入連線和服務 ID 解析請求匹配的服務識別符號。 服務 ID 應以網路位元組順序指定。 如果設定為 IB_CM_ASSIGN_SERVICE_ID,則 CM 將為呼叫者分配一個服務 ID。

描述

如果已有一個 ID 在同一裝置和服務 ID 上偵聽,則返回它。

呼叫者在使用完偵聽器 ID 後應呼叫 ib_destroy_cm_id。

int rdma_rw_ctx_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num, struct scatterlist *sg, u32 sg_cnt, u32 sg_offset, u64 remote_addr, u32 rkey, enum dma_data_direction dir)

初始化 RDMA READ/WRITE 上下文

引數

struct rdma_rw_ctx *ctx

要初始化的上下文

struct ib_qp *qp

要操作的佇列對

u32 port_num

連線繫結到的埠號

struct scatterlist *sg

從中/向其 READ/WRITE 的 scatterlist

u32 sg_cnt

sg 中的條目數

u32 sg_offset

sg 的當前位元組偏移量

u64 remote_addr

要讀取/寫入的遠端地址(相對於 rkey

u32 rkey

要操作的遠端金鑰

enum dma_data_direction dir

DMA_TO_DEVICE 用於 RDMA WRITE,DMA_FROM_DEVICE 用於 RDMA READ

描述

如果成功,則返回工作佇列上所需的 WQE 數量,否則返回負錯誤程式碼。

int rdma_rw_ctx_signature_init(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num, struct scatterlist *sg, u32 sg_cnt, struct scatterlist *prot_sg, u32 prot_sg_cnt, struct ib_sig_attrs *sig_attrs, u64 remote_addr, u32 rkey, enum dma_data_direction dir)

使用簽名解除安裝初始化 RW 上下文

引數

struct rdma_rw_ctx *ctx

要初始化的上下文

struct ib_qp *qp

要操作的佇列對

u32 port_num

連線繫結到的埠號

struct scatterlist *sg

從中/向其 READ/WRITE 的 scatterlist

u32 sg_cnt

sg 中的條目數

struct scatterlist *prot_sg

從中/向其 READ/WRITE 保護資訊的 scatterlist

u32 prot_sg_cnt

prot_sg 中的條目數

struct ib_sig_attrs *sig_attrs

簽名解除安裝演算法

u64 remote_addr

要讀取/寫入的遠端地址(相對於 rkey

u32 rkey

要操作的遠端金鑰

enum dma_data_direction dir

DMA_TO_DEVICE 用於 RDMA WRITE,DMA_FROM_DEVICE 用於 RDMA READ

描述

如果成功,則返回工作佇列上所需的 WQE 數量,否則返回負錯誤程式碼。

struct ib_send_wr *rdma_rw_ctx_wrs(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr)

為 RDMA READ 或 WRITE 操作返回 WR 鏈

引數

struct rdma_rw_ctx *ctx

要操作的上下文

struct ib_qp *qp

要操作的佇列對

u32 port_num

連線繫結到的埠號

struct ib_cqe *cqe

最後一個 WR 的完成佇列條目

struct ib_send_wr *chain_wr

要附加到已釋出鏈的 WR

描述

返回由 ctx 描述的一組 RDMA READ/WRITE 操作的 WR 鏈,以及所需的任何記憶體註冊操作。 如果 chain_wr 為非 NULL,則它指向的 WR 將附加到已釋出的 WR 鏈。 如果未設定 chain_wr,則必須設定 cqe,以便呼叫者收到完成通知。

int rdma_rw_ctx_post(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num, struct ib_cqe *cqe, struct ib_send_wr *chain_wr)

釋出 RDMA READ 或 RDMA WRITE 操作

引數

struct rdma_rw_ctx *ctx

要操作的上下文

struct ib_qp *qp

要操作的佇列對

u32 port_num

連線繫結到的埠號

struct ib_cqe *cqe

最後一個 WR 的完成佇列條目

struct ib_send_wr *chain_wr

要附加到已釋出鏈的 WR

描述

釋出由 ctx 描述的一組 RDMA READ/WRITE 操作,以及所需的任何記憶體註冊操作。 如果 chain_wr 為非 NULL,則它指向的 WR 將附加到已釋出的 WR 鏈。 如果未設定 chain_wr,則必須設定 cqe,以便呼叫者收到完成通知。

void rdma_rw_ctx_destroy(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num, struct scatterlist *sg, u32 sg_cnt, enum dma_data_direction dir)

釋放由 rdma_rw_ctx_init 分配的所有資源

引數

struct rdma_rw_ctx *ctx

要釋放的上下文

struct ib_qp *qp

要操作的佇列對

u32 port_num

連線繫結到的埠號

struct scatterlist *sg

用於 READ/WRITE 的 scatterlist

u32 sg_cnt

sg 中的條目數

enum dma_data_direction dir

DMA_TO_DEVICE 用於 RDMA WRITE,DMA_FROM_DEVICE 用於 RDMA READ

void rdma_rw_ctx_destroy_signature(struct rdma_rw_ctx *ctx, struct ib_qp *qp, u32 port_num, struct scatterlist *sg, u32 sg_cnt, struct scatterlist *prot_sg, u32 prot_sg_cnt, enum dma_data_direction dir)

釋放由 rdma_rw_ctx_signature_init 分配的所有資源

引數

struct rdma_rw_ctx *ctx

要釋放的上下文

struct ib_qp *qp

要操作的佇列對

u32 port_num

連線繫結到的埠號

struct scatterlist *sg

用於 READ/WRITE 的 scatterlist

u32 sg_cnt

sg 中的條目數

struct scatterlist *prot_sg

用於 PI 的 READ/WRITE 的 scatterlist

u32 prot_sg_cnt

prot_sg 中的條目數

enum dma_data_direction dir

DMA_TO_DEVICE 用於 RDMA WRITE,DMA_FROM_DEVICE 用於 RDMA READ

unsigned int rdma_rw_mr_factor(struct ib_device *device, u32 port_num, unsigned int maxpages)

返回有效負載所需的 MR 數量

引數

struct ib_device *device

處理連線的裝置

u32 port_num

連線繫結到的埠號

unsigned int maxpages

每個 rdma_rw_ctx 的最大有效負載頁面數

描述

返回裝置移動 maxpayload 位元組所需的 MR 數量。 返回值在傳輸建立期間用於計算 max_rdma_ctxts 和傳輸的傳送佇列和傳送完成佇列的大小。

bool rdma_dev_access_netns(const struct ib_device *dev, const struct net *net)

返回是否可以從指定的網路名稱空間訪問 rdma 裝置。

引數

const struct ib_device *dev

指向需要檢查的 rdma 裝置的指標

const struct net *net

指向要檢查訪問許可權的網路名稱空間的指標

描述

當 rdma 裝置處於共享模式時,它會忽略網路名稱空間。 當 rdma 裝置專用於網路名稱空間時,將根據指定的網路名稱空間檢查 rdma 裝置網路名稱空間。

void ib_device_put(struct ib_device *device)

釋放 IB 裝置引用

引數

struct ib_device *device

要釋放其引用的裝置

描述

ib_device_put() 釋放對 IB 裝置的引用,以允許其取消註冊並最終釋放。

struct ib_device *ib_device_get_by_name(const char *name, enum rdma_driver_id driver_id)

按名稱查詢 IB 裝置

引數

const char *name

要查詢的名稱

enum rdma_driver_id driver_id

必須匹配的驅動程式 ID(RDMA_DRIVER_UNKNOWN 匹配所有)

描述

按名稱查詢並保持 ib_device。 呼叫者必須在返回的指標上呼叫 ib_device_put()

struct ib_device *_ib_alloc_device(size_t size)

分配 IB 裝置結構

引數

size_t size

要分配的結構的大小

描述

底層驅動程式應使用 ib_alloc_device() 來分配 struct ib_devicesize 是要分配的結構的大小,包括底層驅動程式使用的任何私有資料。 必須使用 ib_dealloc_device() 來釋放使用 ib_alloc_device() 分配的結構。

void ib_dealloc_device(struct ib_device *device)

釋放 IB 裝置結構

引數

struct ib_device *device

要釋放的結構

描述

釋放使用 ib_alloc_device() 分配的結構。

const struct ib_port_immutable *ib_port_immutable_read(struct ib_device *dev, unsigned int port)

讀取 rdma 埠的不可變資料

引數

struct ib_device *dev

IB 裝置

unsigned int port

要讀取其不可變資料的埠號。 它從索引 1 開始,並且有效直到包括 rdma_end_port()。

int ib_register_device(struct ib_device *device, const char *name, struct device *dma_device)

向 IB 核心註冊 IB 裝置

引數

struct ib_device *device

要註冊的裝置

const char *name

唯一的字串裝置名稱。 這可能包括一個“%”,這將導致將唯一的索引新增到傳遞的裝置名稱。

struct device *dma_device

指向支援 DMA 的裝置的指標。 如果 NULL,則將使用 IB 裝置。 在這種情況下,呼叫者應完全設定用於 DMA 的 ibdev。 這通常意味著使用 dma_virt_ops。

描述

底層驅動程式使用 ib_register_device() 向 IB 核心註冊其裝置。 所有註冊的客戶端都將收到為每個新增的裝置的回撥。 必須使用 ib_alloc_device() 分配 device

如果驅動程式使用 ops.dealloc_driver 並非同步呼叫任何 ib_unregister_device(),則裝置指標可能會在本函式返回後立即被釋放。

void ib_unregister_device(struct ib_device *ib_dev)

登出 IB 裝置

引數

struct ib_device *ib_dev

要登出的裝置

描述

登出 IB 裝置。 所有客戶端都將收到刪除回撥。

呼叫者應僅呼叫此例程一次,並防止與註冊發生衝突。 通常,它應該僅作為驅動程式核心的 struct device_driver 及相關實現的刪除回撥的一部分呼叫。

如果使用了 ops.dealloc_driver,則 ib_dev 將在此函式返回時釋放。

void ib_unregister_device_and_put(struct ib_device *ib_dev)

在保持“get”的同時登出裝置

引數

struct ib_device *ib_dev

要登出的裝置

描述

這與 ib_unregister_device() 相同,只不過它包含一個內部 ib_device_put(),它應與呼叫者獲得的“get”匹配。

在保持“get”的同時,從多個執行緒併發呼叫此例程是安全的。 當函式返回時,裝置已完全登出。

使用此流程的驅動程式必須使用 driver_unregister 回撥來清理與其關聯的裝置資源並取消分配。

void ib_unregister_driver(enum rdma_driver_id driver_id)

登出驅動程式的所有 IB 裝置

引數

enum rdma_driver_id driver_id

要登出的驅動程式

描述

這實現了設備註銷的柵欄。 只有與 driver_id 關聯的所有裝置都已完全完成其登出並從 ib_unregister_device*() 返回後,它才會返回。

如果裝置尚未登出,它會繼續並開始登出它們。

這不會阻止使用給定的 driver_id 建立新裝置,這是呼叫者的責任。

void ib_unregister_device_queued(struct ib_device *ib_dev)

使用工作佇列登出裝置

引數

struct ib_device *ib_dev

要登出的裝置

描述

這使用 WQ 計劃裝置的非同步登出。 驅動程式應使用此方法來避免在執行登出時保持鎖定,例如保持 RTNL 鎖定。

使用此 API 的驅動程式必須在模組解除安裝之前使用 ib_unregister_driver,以確保所有計劃的登出都已完成。

int ib_register_client(struct ib_client *client)

註冊 IB 客戶端

引數

struct ib_client *client

要註冊的客戶端

描述

IB 驅動程式的上層使用者可以使用 ib_register_client() 註冊 IB 裝置新增和刪除的回撥。 新增 IB 裝置時,將呼叫每個註冊客戶端的 add 方法(按客戶端註冊的順序);刪除裝置時,將呼叫每個客戶端的 remove 方法(按客戶端註冊的相反順序)。 此外,呼叫 ib_register_client() 時,客戶端將收到對所有已註冊裝置的添加回調。

void ib_unregister_client(struct ib_client *client)

登出 IB 客戶端

引數

struct ib_client *client

要登出的客戶端

描述

上層使用者使用 ib_unregister_client() 刪除其客戶端註冊。 呼叫 ib_unregister_client() 時,客戶端將收到對每個仍註冊的 IB 裝置的刪除回撥。

這是一個完整的柵欄,一旦它返回,將不會呼叫任何客戶端回撥,也不會在另一個執行緒中執行。

void ib_set_client_data(struct ib_device *device, struct ib_client *client, void *data)

設定 IB 客戶端上下文

引數

struct ib_device *device

要設定上下文的裝置

struct ib_client *client

要設定上下文的客戶端

void *data

要設定的上下文

描述

ib_set_client_data() 設定可以使用 ib_get_client_data() 檢索的客戶端上下文資料。 這隻能在客戶端註冊到裝置時呼叫,一旦 ib_client remove() 回撥返回,就無法呼叫此方法。

void ib_register_event_handler(struct ib_event_handler *event_handler)

註冊 IB 事件處理程式

引數

struct ib_event_handler *event_handler

要註冊的處理程式

描述

ib_register_event_handler() 註冊一個事件處理程式,當發生非同步 IB 事件時(如 InfiniBand 架構規範的第 11 章中所定義),將回調該處理程式。 此回調發生在工作佇列上下文中。

void ib_unregister_event_handler(struct ib_event_handler *event_handler)

登出事件處理程式

引數

struct ib_event_handler *event_handler

要登出的處理程式

描述

登出使用 ib_register_event_handler() 註冊的事件處理程式。

int ib_query_port(struct ib_device *device, u32 port_num, struct ib_port_attr *port_attr)

查詢 IB 埠屬性

引數

struct ib_device *device

要查詢的裝置

u32 port_num

要查詢的埠號

struct ib_port_attr *port_attr

埠屬性

描述

ib_query_port() 透過 port_attr 指標返回埠的屬性。

int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev, u32 port)

將 ib_dev 與底層 net_device 關聯

引數

struct ib_device *ib_dev

要修改的裝置

struct net_device *ndev

要關聯的 net_device,可以為 NULL

u32 port

net_device 連線到的 IB 埠

描述

驅動程式應使用此方法將 ib_device 連結到 netdev,以便 netdev 顯示在諸如 ib_enum_roce_netdev 之類的介面中。 任何埠只能關聯一個 netdev。

呼叫者必須確保給定的 ndev 未登出或正在登出,並且當 ndev 傳送 NETDEV_UNREGISTER 事件時,ib_device 已登出或呼叫了 ib_device_set_netdev() 並傳入 NULL。

int ib_query_netdev_port(struct ib_device *ibdev, struct net_device *ndev, u32 *port)

查詢與 ibdev 關聯的 net_device 的埠號

引數

struct ib_device *ibdev

IB 裝置

struct net_device *ndev

網路裝置

u32 *port

net_device 連線到的 IB 埠

struct ib_device *ib_device_get_by_netdev(struct net_device *ndev, enum rdma_driver_id driver_id)

查詢與 netdev 關聯的 IB 裝置

引數

struct net_device *ndev

要定位的 netdev

enum rdma_driver_id driver_id

必須匹配的驅動程式 ID(RDMA_DRIVER_UNKNOWN 匹配所有)

描述

查詢並持有透過 ib_device_set_netdev() 與 netdev 關聯的 ib_device。呼叫者必須在返回的指標上呼叫 ib_device_put()

int ib_query_pkey(struct ib_device *device, u32 port_num, u16 index, u16 *pkey)

獲取 P_Key 表項

引數

struct ib_device *device

要查詢的裝置

u32 port_num

要查詢的埠號

u16 index

要查詢的 P_Key 表索引

u16 *pkey

返回的 P_Key

描述

ib_query_pkey() 獲取指定的 P_Key 表項。

int ib_modify_device(struct ib_device *device, int device_modify_mask, struct ib_device_modify *device_modify)

更改 IB 裝置屬性

引數

struct ib_device *device

要修改的裝置

int device_modify_mask

要更改的屬性的掩碼

struct ib_device_modify *device_modify

新的屬性值

描述

ib_modify_device() 按照 device_modify_maskdevice_modify 結構指定的更改裝置的屬性。

int ib_modify_port(struct ib_device *device, u32 port_num, int port_modify_mask, struct ib_port_modify *port_modify)

修改指定埠的屬性。

引數

struct ib_device *device

要修改的裝置。

u32 port_num

要修改的埠號。

int port_modify_mask

用於指定要更改的埠屬性的掩碼。

struct ib_port_modify *port_modify

埠的新屬性值。

描述

ib_modify_port() 按照 port_modify_maskport_modify 結構指定的更改埠的屬性。

int ib_find_gid(struct ib_device *device, union ib_gid *gid, u32 *port_num, u16 *index)

返回指定的 GID 值出現的埠號和 GID 表索引。它僅搜尋 IB 鏈路層。

引數

struct ib_device *device

要查詢的裝置。

union ib_gid *gid

要搜尋的 GID 值。

u32 *port_num

找到 GID 值的裝置的埠號。

u16 *index

GID 所在的 GID 表中的索引。此引數可以為 NULL。

int ib_find_pkey(struct ib_device *device, u32 port_num, u16 pkey, u16 *index)

返回指定的 PKey 值出現的 PKey 表索引。

引數

struct ib_device *device

要查詢的裝置。

u32 port_num

要搜尋 PKey 的裝置的埠號。

u16 pkey

要搜尋的 PKey 值。

u16 *index

PKey 所在的 PKey 表中的索引。

struct net_device *ib_get_net_dev_by_params(struct ib_device *dev, u32 port, u16 pkey, const union ib_gid *gid, const struct sockaddr *addr)

返回接收到的 CM 請求的適當的 net_dev

引數

struct ib_device *dev

已接收請求的 RDMA 裝置。

u32 port

RDMA 裝置上的埠號。

u16 pkey

請求發出的 Pkey。

const union ib_gid *gid

net_dev 用於通訊的 GID。

const struct sockaddr *addr

包含請求指定的作為其目標的 IP 地址。

struct ib_pd *__ib_alloc_pd(struct ib_device *device, unsigned int flags, const char *caller)

分配未使用的保護域。

引數

struct ib_device *device

要在其上分配保護域的裝置。

unsigned int flags

保護域標誌

const char *caller

呼叫者的構建時模組名稱

描述

保護域物件提供 QP、共享接收佇列、地址控制代碼、記憶體區域和記憶體視窗之間的關聯。

每個 PD 都有一個 local_dma_lkey,可以用作本地記憶體操作的 lkey 值。

int ib_dealloc_pd_user(struct ib_pd *pd, struct ib_udata *udata)

釋放保護域。

引數

struct ib_pd *pd

要釋放的保護域。

struct ib_udata *udata

有效的使用者資料,如果是核心物件,則為 NULL

描述

如果 pd 中仍然存在任何資源,則呼叫此函式是錯誤的。呼叫者負責同步銷燬它們並保證不會發生新的分配。

void rdma_copy_ah_attr(struct rdma_ah_attr *dest, const struct rdma_ah_attr *src)

將 rdma ah 屬性從源複製到目標。

引數

struct rdma_ah_attr *dest

指向目標 ah_attr 的指標。假定目標指標的內容無效,並且屬性將被覆蓋。

const struct rdma_ah_attr *src

指向源 ah_attr 的指標。

void rdma_replace_ah_attr(struct rdma_ah_attr *old, const struct rdma_ah_attr *new)

用新的 ah_attr 替換有效的 ah_attr。

引數

struct rdma_ah_attr *old

指向需要替換的現有 ah_attr 的指標。假定 old 有效或已清零

const struct rdma_ah_attr *new

指向新的 ah_attr 的指標。

描述

rdma_replace_ah_attr() 首先釋放舊 ah_attr 中的任何引用(如果 old ah_attr 有效);之後,它會複製新屬性並持有對已替換 ah_attr 的引用。

void rdma_move_ah_attr(struct rdma_ah_attr *dest, struct rdma_ah_attr *src)

將源指向的 ah_attr 移動到目標。

引數

struct rdma_ah_attr *dest

指向要複製到的目標 ah_attr 的指標。假定 dest 有效或已清零

struct rdma_ah_attr *src

指向新的 ah_attr 的指標。

描述

rdma_move_ah_attr() 首先釋放目標 ah_attr 中的任何引用(如果有效)。 這也會將內部引用的所有權從 src 轉移到 dest,從而使 src 在該過程中無效。 不會獲取 src ah_attr 的新引用。

struct ib_ah *rdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr, u32 flags)

為給定的地址向量建立地址控制代碼。

引數

struct ib_pd *pd

與地址控制代碼關聯的保護域。

struct rdma_ah_attr *ah_attr

地址向量的屬性。

u32 flags

建立地址控制代碼標誌(參見 enum rdma_create_ah_flags)。

描述

成功時返回 0,錯誤時返回相應的錯誤程式碼。 地址控制代碼用於引用所有 UD QP post 傳送中的本地或全域性目標。

struct ib_ah *rdma_create_user_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr, struct ib_udata *udata)

為給定的地址向量建立地址控制代碼。 它解析 RoCE 型別的 ah 屬性的目標 MAC 地址。

引數

struct ib_pd *pd

與地址控制代碼關聯的保護域。

struct rdma_ah_attr *ah_attr

地址向量的屬性。

struct ib_udata *udata

指向提供程式驅動程式所需的使用者輸入輸出緩衝區資訊的指標。

描述

成功時返回 0,錯誤時返回相應的錯誤程式碼。 地址控制代碼用於引用所有 UD QP post 傳送中的本地或全域性目標。

void rdma_move_grh_sgid_attr(struct rdma_ah_attr *attr, union ib_gid *dgid, u32 flow_label, u8 hop_limit, u8 traffic_class, const struct ib_gid_attr *sgid_attr)

設定 GRH 的 sgid 屬性,獲取引用的所有權

引數

struct rdma_ah_attr *attr

指向 AH 屬性結構的指標

union ib_gid *dgid

目標 GID

u32 flow_label

流標籤

u8 hop_limit

跳數限制

u8 traffic_class

流量類別

const struct ib_gid_attr *sgid_attr

指向 SGID 屬性的指標

描述

此函式取得 sgid_attr 引用的所有權。呼叫者必須確保在呼叫此函式之後銷燬 rdma_ah_attr 之前呼叫 rdma_destroy_ah_attr()

void rdma_destroy_ah_attr(struct rdma_ah_attr *ah_attr)

釋放對 ah 屬性的 SGID 屬性的引用。

引數

struct rdma_ah_attr *ah_attr

指向 ah 屬性的指標

描述

如果 ah 屬性的 SGID 屬性非空,則釋放對它的引用。可以安全地多次呼叫此函式,也可以安全地在零初始化的 ah_attr 上呼叫它。

struct ib_srq *ib_create_srq_user(struct ib_pd *pd, struct ib_srq_init_attr *srq_init_attr, struct ib_usrq_object *uobject, struct ib_udata *udata)

建立與指定保護域關聯的 SRQ。

引數

struct ib_pd *pd

與 SRQ 關聯的保護域。

struct ib_srq_init_attr *srq_init_attr

建立 SRQ 所需的初始屬性列表。如果 SRQ 建立成功,則屬性將更新為已建立 SRQ 的實際能力。

struct ib_usrq_object *uobject

如果這不是核心 SRQ,則為 uobject 指標

struct ib_udata *udata

如果這不是核心 SRQ,則為 udata 指標

描述

srq_attr->max_wr 和 srq_attr->max_sge 被讀取以確定 SRQ 的請求大小,並在返回時設定為實際分配的值。如果 ib_create_srq() 成功,則 max_wr 和 max_sge 將始終至少與請求的值一樣大。

struct ib_qp *ib_create_qp_user(struct ib_device *dev, struct ib_pd *pd, struct ib_qp_init_attr *attr, struct ib_udata *udata, struct ib_uqp_object *uobj, const char *caller)

建立與指定保護域關聯的 QP。

引數

struct ib_device *dev

IB 裝置

struct ib_pd *pd

與 QP 關聯的保護域。

struct ib_qp_init_attr *attr

建立 QP 所需的初始屬性列表。如果 QP 建立成功,則屬性將更新為已建立 QP 的實際能力。

struct ib_udata *udata

使用者資料

struct ib_uqp_object *uobj

uverbs 物件

const char *caller

呼叫者的構建時模組名稱

int ib_modify_qp_with_udata(struct ib_qp *ib_qp, struct ib_qp_attr *attr, int attr_mask, struct ib_udata *udata)

修改指定 QP 的屬性。

引數

struct ib_qp *ib_qp

要修改的 QP。

struct ib_qp_attr *attr

在輸入時,指定要修改的 QP 屬性。在輸出時,返回選定的 QP 屬性的當前值。

int attr_mask

一個位掩碼,用於指定正在修改 QP 的哪些屬性。

struct ib_udata *udata

指向使用者輸入輸出緩衝區資訊的指標正在被修改。成功時返回 0,出錯時返回適當的錯誤程式碼。

struct ib_mr *ib_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, u32 max_num_sg)

分配一個記憶體區域

引數

struct ib_pd *pd

與該區域關聯的保護域

enum ib_mr_type mr_type

記憶體區域型別

u32 max_num_sg

可用於註冊的最大 sg 條目數。

註釋

記憶體註冊頁/sg 列表不得超過 max_num_sg。對於 mr_type IB_MR_TYPE_MEM_REG,總長度不能超過 max_num_sg * used_page_size。

struct ib_mr *ib_alloc_mr_integrity(struct ib_pd *pd, u32 max_num_data_sg, u32 max_num_meta_sg)

分配一個完整性記憶體區域

引數

struct ib_pd *pd

與該區域關聯的保護域

u32 max_num_data_sg

可用於註冊的最大資料 sg 條目數

u32 max_num_meta_sg

可用於註冊的最大元資料 sg 條目數

註釋

記憶體註冊頁/sg 列表不得超過 max_num_sg,完整性頁/sg 列表也不得超過 max_num_meta_sg。

struct ib_xrcd *ib_alloc_xrcd_user(struct ib_device *device, struct inode *inode, struct ib_udata *udata)

分配一個 XRC 域。

引數

struct ib_device *device

要在其上分配 XRC 域的裝置。

struct inode *inode

用於連線 XRCD 的 inode

struct ib_udata *udata

有效的使用者資料,如果是核心物件,則為 NULL

int ib_dealloc_xrcd_user(struct ib_xrcd *xrcd, struct ib_udata *udata)

釋放一個 XRC 域。

引數

struct ib_xrcd *xrcd

要釋放的 XRC 域。

struct ib_udata *udata

有效的使用者資料,如果是核心物件,則為 NULL

struct ib_wq *ib_create_wq(struct ib_pd *pd, struct ib_wq_init_attr *wq_attr)

建立與指定保護域關聯的 WQ。

引數

struct ib_pd *pd

與 WQ 關聯的保護域。

struct ib_wq_init_attr *wq_attr

建立 WQ 所需的初始屬性列表。如果 WQ 建立成功,則屬性將更新為已建立 WQ 的實際能力。

描述

wq_attr->max_wr 和 wq_attr->max_sge 確定 WQ 的請求大小,並在返回時設定為實際分配的值。如果 ib_create_wq() 成功,則 max_wr 和 max_sge 將始終至少與請求的值一樣大。

int ib_destroy_wq_user(struct ib_wq *wq, struct ib_udata *udata)

銷燬指定的使用者 WQ。

引數

struct ib_wq *wq

要銷燬的 WQ。

struct ib_udata *udata

有效的使用者資料

int ib_map_mr_sg_pi(struct ib_mr *mr, struct scatterlist *data_sg, int data_sg_nents, unsigned int *data_sg_offset, struct scatterlist *meta_sg, int meta_sg_nents, unsigned int *meta_sg_offset, unsigned int page_size)

對映用於 PI(保護資訊)的 DMA 對映 SG 列表,併為註冊設定適當的記憶體區域。

引數

struct ib_mr *mr

記憶體區域

struct scatterlist *data_sg

用於資料的 DMA 對映散列表

int data_sg_nents

data_sg 中的條目數

unsigned int *data_sg_offset

到 data_sg 中的位元組偏移量

struct scatterlist *meta_sg

用於元資料的 DMA 對映散列表

int meta_sg_nents

meta_sg 中的條目數

unsigned int *meta_sg_offset

到 meta_sg 中的位元組偏移量

unsigned int page_size

頁面向量所需頁面大小

描述

約束:- MR 必須使用型別 IB_MR_TYPE_INTEGRITY 分配。

成功完成後,記憶體區域就可以進行註冊了。

返回

成功時為 0。

int ib_map_mr_sg(struct ib_mr *mr, struct scatterlist *sg, int sg_nents, unsigned int *sg_offset, unsigned int page_size)

對映 DMA 對映 SG 列表的最大字首,並將其設定為記憶體區域。

引數

struct ib_mr *mr

記憶體區域

struct scatterlist *sg

DMA 對映散列表

int sg_nents

sg 中的條目數

unsigned int *sg_offset

到 sg 中的位元組偏移量

unsigned int page_size

頁面向量所需頁面大小

描述

約束

  • 允許第一個 sg 元素具有偏移量。

  • 每個 sg 元素必須與 page_size 對齊,或者在虛擬上與前一個元素連續。如果 sg 元素具有非連續偏移量,則對映字首將不包含它。

  • 允許最後一個 sg 元素的長度小於 page_size。

  • 如果 sg_nents 總位元組長度超過 mr max_num_sge * page_size,則僅對映 max_num_sg 條目。

  • 如果 MR 使用型別 IB_MR_TYPE_SG_GAPS 分配,則所有這些約束都不成立,並且 page_size 引數將被忽略。

返回對映到記憶體區域的 sg 元素的數量。

成功完成後,記憶體區域就可以進行註冊了。

int ib_sg_to_pages(struct ib_mr *mr, struct scatterlist *sgl, int sg_nents, unsigned int *sg_offset_p, int (*set_page)(struct ib_mr*, u64))

將 sg 列表的最大字首轉換為頁面向量

引數

struct ib_mr *mr

記憶體區域

struct scatterlist *sgl

DMA 對映散列表

int sg_nents

sg 中的條目數

unsigned int *sg_offset_p

輸入

到 sg 中的起始偏移量(以位元組為單位)

輸出

對於 sg 的元素 n,未處理的第一個位元組的偏移量(以位元組為單位),其中 n 是此函式的返回值。

int (*set_page)(struct ib_mr *, u64)

驅動程式頁面分配函式指標

描述

核心服務輔助函式,用於驅動程式將給定的sg列表的最大字首轉換為頁面向量。轉換後的sg列表字首是滿足ib_map_mr_sg要求的那個字首。

返回已分配給頁面向量的sg元素的數量。

void ib_drain_sq(struct ib_qp *qp)

阻塞直到所有SQ CQE都被應用程式消耗。

引數

struct ib_qp *qp

要清空的佇列對

描述

如果裝置具有特定於提供程式的清空函式,則呼叫該函式。否則,呼叫通用清空函式 __ib_drain_sq()。

呼叫者必須

確保CQ和SQ中有足夠的空間用於清空工作請求和完成。

使用 ib_alloc_cq() 分配 CQ。

確保沒有其他上下文同時釋出WR。否則,無法保證清空。

void ib_drain_rq(struct ib_qp *qp)

阻塞直到所有RQ CQE都被應用程式消耗。

引數

struct ib_qp *qp

要清空的佇列對

描述

如果裝置具有特定於提供程式的清空函式,則呼叫該函式。否則,呼叫通用清空函式 __ib_drain_rq()。

呼叫者必須

確保 CQ 和 RQ 中有足夠的空間用於清空工作請求和完成。

使用 ib_alloc_cq() 分配 CQ。

確保沒有其他上下文同時釋出WR。否則,無法保證清空。

void ib_drain_qp(struct ib_qp *qp)

阻塞直到 RQ 和 SQ 上的所有 CQE 都被應用程式消耗。

引數

struct ib_qp *qp

要清空的佇列對

描述

呼叫者必須

確保 CQ(s)、SQ 和 RQ 中有足夠的空間用於清空工作請求和完成。

使用 ib_alloc_cq() 分配 CQ。

確保沒有其他上下文同時釋出WR。否則,無法保證清空。

struct rdma_hw_stats *rdma_alloc_hw_stats_struct(const struct rdma_stat_desc *descs, int num_counters, unsigned long lifespan)

驅動程式分配動態結構體的輔助函式。

引數

const struct rdma_stat_desc *descs

靜態描述符陣列

int num_counters

陣列中的元素數量

unsigned long lifespan

更新之間的毫秒數

void rdma_free_hw_stats_struct(struct rdma_hw_stats *stats)

釋放 rdma_hw_stats 的輔助函式

引數

struct rdma_hw_stats *stats

要釋放的統計資訊

void ib_pack(const struct ib_field *desc, int desc_len, void *structure, void *buf)

將結構體打包到緩衝區中

引數

const struct ib_field *desc

結構體欄位描述陣列

int desc_len

desc 中的條目數

void *structure

要從中打包的結構體

void *buf

要打包到的緩衝區

描述

ib_pack() 根據 desc 中的欄位陣列,將結構體欄位列表打包到緩衝區中。

void ib_unpack(const struct ib_field *desc, int desc_len, void *buf, void *structure)

將緩衝區解包到結構體中

引數

const struct ib_field *desc

結構體欄位描述陣列

int desc_len

desc 中的條目數

void *buf

要從中解包的緩衝區

void *structure

要解包到的結構體

描述

ib_pack() 根據 desc 中的欄位陣列,從緩衝區解包結構體欄位列表。

void ib_sa_cancel_query(int id, struct ib_sa_query *query)

嘗試取消SA查詢

引數

int id

要取消的查詢的ID

struct ib_sa_query *query

要取消的查詢指標

描述

嘗試取消 SA 查詢。如果 ID 和查詢不匹配,或者查詢已完成,則不執行任何操作。否則,查詢將被取消,並將以 -EINTR 狀態完成。

int ib_init_ah_attr_from_path(struct ib_device *device, u32 port_num, struct sa_path_rec *rec, struct rdma_ah_attr *ah_attr, const struct ib_gid_attr *gid_attr)

根據 SA 路徑記錄初始化地址控制代碼屬性。

引數

struct ib_device *device

與 ah 屬性初始化相關的裝置。

u32 port_num

指定裝置上的埠。

struct sa_path_rec *rec

用於 ah 屬性初始化的路徑記錄條目。

struct rdma_ah_attr *ah_attr

從路徑記錄初始化的地址控制代碼屬性。

const struct ib_gid_attr *gid_attr

初始化期間要考慮的 SGID 屬性。

描述

ib_init_ah_attr_from_path() 返回成功時,(a) 對於 IB 連結層,如果 GRH 存在於 IB 連結層中,則它可能包含對 SGID 屬性的引用。(b) 對於 RoCE 連結層,它包含對 SGID 屬性的引用。使用者必須呼叫 rdma_destroy_ah_attr() 來釋放對使用 ib_init_ah_attr_from_path() 初始化的 SGID 屬性的引用。

int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device, u32 port_num, struct sa_path_rec *rec, ib_sa_comp_mask comp_mask, unsigned long timeout_ms, gfp_t gfp_mask, void (*callback)(int status, struct sa_path_rec *resp, unsigned int num_paths, void *context), void *context, struct ib_sa_query **sa_query)

啟動路徑獲取查詢

引數

struct ib_sa_client *client

SA 客戶端

struct ib_device *device

在其上傳送查詢的裝置

u32 port_num

在其上傳送查詢的埠號

struct sa_path_rec *rec

要在查詢中傳送的路徑記錄

ib_sa_comp_mask comp_mask

要在查詢中傳送的元件掩碼

unsigned long timeout_ms

等待響應的時間

gfp_t gfp_mask

用於內部分配的GFP掩碼

void (*callback)(int status, struct sa_path_rec *resp, unsigned int num_paths, void *context)

查詢完成、超時或取消時呼叫的函式

void *context

傳遞給回撥的不透明使用者上下文

struct ib_sa_query **sa_query

查詢上下文,用於取消查詢

描述

向 SA 傳送路徑記錄獲取查詢以查詢路徑。查詢完成(或失敗)時將呼叫回撥函式;狀態 0 表示成功響應,-EINTR 表示查詢已取消,-ETIMEDOUT 表示查詢超時,-EIO 表示傳送查詢時發生錯誤。僅當狀態為 0 時,回撥的 resp 引數才有效。

如果 ib_sa_path_rec_get() 的返回值是負數,則表示錯誤程式碼。否則,它是一個查詢 ID,可用於取消查詢。

int ib_ud_header_init(int payload_bytes, int lrh_present, int eth_present, int vlan_present, int grh_present, int ip_version, int udp_present, int immediate_present, struct ib_ud_header *header)

初始化 UD 報頭結構

引數

int payload_bytes

資料包有效負載的長度

int lrh_present

指定是否出現 LRH

int eth_present

指定是否出現 Eth 報頭

int vlan_present

資料包已標記 vlan

int grh_present

GRH 標誌(如果非零,將包括 GRH)

int ip_version

如果非零,將包括 IP 報頭,V4 或 V6

int udp_present

如果非零,將包括 UDP 報頭

int immediate_present

指定是否存在立即資料

struct ib_ud_header *header

要初始化的結構

int ib_ud_header_pack(struct ib_ud_header *header, void *buf)

將 UD 報頭結構打包為線路格式

引數

struct ib_ud_header *header

UD 報頭結構

void *buf

要打包到的緩衝區

描述

ib_ud_header_pack() 將 UD 報頭結構 header 打包為緩衝區 buf 中的線路格式。

unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem, unsigned long pgsz_bitmap, unsigned long virt)

查詢用於此 MR 的最佳 HW 頁面大小

引數

struct ib_umem *umem

umem 結構

unsigned long pgsz_bitmap

HW 支援的頁面大小的點陣圖

unsigned long virt

IOVA

描述

此輔助函式適用於支援多個頁面大小但只能在 MR 中執行單個頁面大小的 HW。

如果 umem 需要驅動程式不支援的頁面大小才能對映,則返回 0。始終支援 PAGE_SIZE 或更小的驅動程式將永遠看不到 0 結果。

struct ib_umem *ib_umem_get(struct ib_device *device, unsigned long addr, size_t size, int access)

鎖定並 DMA 對映使用者空間記憶體。

引數

struct ib_device *device

用於連線 UMEM 的 IB 裝置

unsigned long addr

起始的使用者空間虛擬地址

size_t size

要鎖定的區域的長度

int access

被鎖定記憶體的 IB_ACCESS_xxx 標誌

void ib_umem_release(struct ib_umem *umem)

釋放透過 ib_umem_get 鎖定的記憶體

引數

struct ib_umem *umem

要釋放的 umem 結構

struct ib_umem_odp *ib_umem_odp_alloc_implicit(struct ib_device *device, int access)

分配一個父級隱式 ODP umem

引數

struct ib_device *device

用於建立 UMEM 的 IB 裝置

int access

ib_reg_mr 訪問標誌

描述

隱式 ODP umem 沒有 VA 範圍,也沒有任何頁面列表。它們的存在只是為了儲存 per_mm 引用,以幫助驅動程式建立子 umem。

struct ib_umem_odp *ib_umem_odp_alloc_child(struct ib_umem_odp *root, unsigned long addr, size_t size, const struct mmu_interval_notifier_ops *ops)

在隱式父 ODP umem 下分配一個子 ODP umem

引數

struct ib_umem_odp *root

包含子 umem 的父 umem。這必須使用 ib_alloc_implicit_odp_umem() 分配

unsigned long addr

起始使用者空間 VA

size_t size

使用者空間 VA 的長度

const struct mmu_interval_notifier_ops *ops

MMU 間隔操作,當前只有 invalidate

struct ib_umem_odp *ib_umem_odp_get(struct ib_device *device, unsigned long addr, size_t size, int access, const struct mmu_interval_notifier_ops *ops)

為使用者空間 va 建立一個 umem_odp

引數

struct ib_device *device

用於獲取 UMEM 的 IB 裝置結構

unsigned long addr

起始的使用者空間虛擬地址

size_t size

要鎖定的區域的長度

int access

被鎖定記憶體的 IB_ACCESS_xxx 標誌

const struct mmu_interval_notifier_ops *ops

MMU 間隔操作,當前只有 invalidate

描述

當訪問標誌指示 ODP 記憶體時,驅動程式應使用它。它避免了鎖定,而是儲存 mm 以便將來結合 MMU 通知器進行頁面錯誤處理。

int ib_umem_odp_map_dma_and_lock(struct ib_umem_odp *umem_odp, u64 user_virt, u64 bcnt, u64 access_mask, bool fault)

在 ODP MR 中 DMA 對映使用者空間記憶體並鎖定它。

引數

struct ib_umem_odp *umem_odp

要對映和鎖定的 umem

u64 user_virt

我們需要從中對映的地址。

u64 bcnt

要鎖定和對映的最小位元組數。由於對齊,對映可能會更大,並且在鎖定或對映頁面出錯的情況下,對映也可能會更小。實際對映的頁面在返回值中返回。

u64 access_mask

給定範圍的請求訪問許可權的位掩碼。

bool fault

給定範圍是否需要頁面錯誤

描述

將引數中傳遞的範圍對映到 DMA 地址。成功後,ODP MR 將被鎖定,以允許呼叫者完成其裝置頁表更新。

成功時返回對映的頁數,失敗時返回負錯誤程式碼。

RDMA Verbs 傳輸庫

int rvt_fast_reg_mr(struct rvt_qp *qp, struct ib_mr *ibmr, u32 key, int access)

快速註冊物理 MR

引數

struct rvt_qp *qp

工作請求來自的佇列對

struct ib_mr *ibmr

要註冊的記憶體區域

u32 key

此記憶體區域的更新後的金鑰

int access

此記憶體區域的訪問標誌

描述

成功時返回 0。

int rvt_invalidate_rkey(struct rvt_qp *qp, u32 rkey)

使 MR rkey 無效

引數

struct rvt_qp *qp

與失效操作關聯的佇列對

u32 rkey

要失效的 rkey

描述

成功時返回 0。

int rvt_lkey_ok(struct rvt_lkey_table *rkt, struct rvt_pd *pd, struct rvt_sge *isge, struct rvt_sge *last_sge, struct ib_sge *sge, int acc)

檢查 IB SGE 的有效性並進行初始化

引數

struct rvt_lkey_table *rkt

包含用於檢查 SGE 的 lkey 的表

struct rvt_pd *pd

保護域

struct rvt_sge *isge

傳出的內部 SGE

struct rvt_sge *last_sge

寫入的最後一個傳出 SGE

struct ib_sge *sge

要檢查的 SGE

int acc

訪問標誌

描述

檢查 IB SGE 的有效性並初始化我們的內部版本。

儲存新 sge 時,遞增引用計數。

返回

如果壓縮則為 0,如果新增則為 1,否則返回 -errno。

int rvt_rkey_ok(struct rvt_qp *qp, struct rvt_sge *sge, u32 len, u64 vaddr, u32 rkey, int acc)

檢查 IB 虛擬地址、長度和 RKEY

引數

struct rvt_qp *qp

用於驗證的 qp

struct rvt_sge *sge

SGE 狀態

u32 len

資料長度

u64 vaddr

放置資料的虛擬地址

u32 rkey

要檢查的 rkey

int acc

訪問標誌

返回

如果成功,則為 1,否則為 0。

描述

成功時遞增引用計數

__be32 rvt_compute_aeth(struct rvt_qp *qp)

計算 AETH(症狀 + MSN)

引數

struct rvt_qp *qp

用於計算 AETH 的佇列對

描述

返回 AETH。

void rvt_get_credit(struct rvt_qp *qp, u32 aeth)

重新整理 QP 的傳送工作佇列

引數

struct rvt_qp *qp

要刷新發送工作佇列的 qp

u32 aeth

確認擴充套件傳輸標頭

描述

應持有 QP s_lock。

u32 rvt_restart_sge(struct rvt_sge_state *ss, struct rvt_swqe *wqe, u32 len)

為 wqe 倒回 sge 狀態

引數

struct rvt_sge_state *ss

sge 狀態指標

struct rvt_swqe *wqe

要倒回的 wqe

u32 len

從 wqe 的開頭算起的資料長度(以位元組為單位)

描述

返回剩餘資料長度。

int rvt_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr)

驗證 AH 的屬性

引數

struct ib_device *ibdev

ib 裝置

struct rdma_ah_attr *ah_attr

AH 的屬性

描述

如果驅動程式支援更詳細的 check_ah 函式回撥,否則僅檢查基本內容。

返回

成功時為 0

struct rvt_dev_info *rvt_alloc_device(size_t size, int nports)

分配 rdi

引數

size_t size

要分配的結構體的大小

int nports

要為其分配陣列槽位的埠數

描述

使用 IB 核心裝置分配來為 rdi 分配空間,該空間被假定在 ib_device 內部。驅動程式需要的任何額外空間都應包含在大小中。

我們還基於埠數分配一個埠陣列。

返回

指向分配的 rdi 的指標

void rvt_dealloc_device(struct rvt_dev_info *rdi)

釋放 rdi

引數

struct rvt_dev_info *rdi

要釋放的結構

描述

釋放使用 rvt_alloc_device() 分配的結構

int rvt_register_device(struct rvt_dev_info *rdi)

註冊驅動程式

引數

struct rvt_dev_info *rdi

所有 rdmavt 操作的主要 dev 結構

描述

驅動程式負責分配 rdi 並填寫相應的資訊。

返回

成功時返回 0,否則返回 errno。

void rvt_unregister_device(struct rvt_dev_info *rdi)

刪除驅動程式

引數

struct rvt_dev_info *rdi

rvt dev 結構

int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port, int port_index, u16 *pkey_table)

初始化驅動埠的內部資料

引數

struct rvt_dev_info *rdi

rvt_dev_info 結構體

struct rvt_ibport *port

rvt 埠

int port_index

埠的基於0的索引,與IB核心埠號不同

u16 *pkey_table

的 pkey_table

描述

跟蹤埠列表。不需要分離埠。它們會一直存在,直到驅動程式消失。

返回

始終為 0

bool rvt_cq_enter(struct rvt_cq *cq, struct ib_wc *entry, bool solicited)

向完成佇列新增新條目

引數

struct rvt_cq *cq

完成佇列

struct ib_wc *entry

要新增的工作完成條目

bool solicited

如果 entry 是請求的,則為 true

描述

這可能會在持有 qp->s_lock 的情況下呼叫。

返回

成功時返回 true,否則如果 cq 已滿則返回 false。

int rvt_error_qp(struct rvt_qp *qp, enum ib_wc_status err)

將 QP 置於錯誤狀態

引數

struct rvt_qp *qp

要置於錯誤狀態的 QP

enum ib_wc_status err

如果 RWQE 處於活動狀態,則要發出訊號的接收完成錯誤

描述

刷新發送和接收工作佇列。

返回

如果應生成最後一個 WQE 事件,則為 true。應持有 QP r_lock 和 s_lock,並且應停用中斷。如果已處於錯誤狀態,則只需返回。

int rvt_get_rwqe(struct rvt_qp *qp, bool wr_id_only)

將下一個 RWQE 複製到 QP 的 RWQE 中

引數

struct rvt_qp *qp

QP

bool wr_id_only

僅更新 qp->r_wr_id,不更新 qp->r_sge

描述

如果存在本地錯誤,則返回 -1;如果沒有 RWQE 可用,則返回 0;否則返回 1。

可以從中斷級別呼叫。

void rvt_comm_est(struct rvt_qp *qp)

處理已建立 QP 的陷阱

引數

struct rvt_qp *qp

QP

void rvt_add_rnr_timer(struct rvt_qp *qp, u32 aeth)

在 QP 上新增/啟動 rnr 計時器

引數

struct rvt_qp *qp

QP

u32 aeth

RNR 超時的 aeth,模擬環回的 aeth

void rvt_stop_rc_timers(struct rvt_qp *qp)

停止所有計時器

引數

struct rvt_qp *qp

QP 停止任何掛起的計時器

void rvt_del_timers_sync(struct rvt_qp *qp)

等待任何超時例程退出

引數

struct rvt_qp *qp

QP

struct rvt_qp_iter *rvt_qp_iter_init(struct rvt_dev_info *rdi, u64 v, void (*cb)(struct rvt_qp *qp, u64 v))

QP 迭代的初始化

引數

struct rvt_dev_info *rdi

rvt devinfo

u64 v

u64 值

void (*cb)(struct rvt_qp *qp, u64 v)

使用者定義的回撥

描述

這返回一個適合於迭代系統中 QP 的迭代器。

cb 是使用者定義的回撥,v 是傳遞給 cb 並在其中處理的 64 位值。一個用例是基於 rvt_qp 中不包含的標準來更改 QP 處理。

需要記憶體分配成功的用例必須預先分配適當的記憶體。

返回

指向 rvt_qp_iter 的指標或 NULL

int rvt_qp_iter_next(struct rvt_qp_iter *iter)

返回迭代器中的下一個 QP

引數

struct rvt_qp_iter *iter

迭代器

描述

細粒度的 QP 迭代器,適用於 debugfs seq_file 機制。

當返回值為 0 時,使用當前 QP 更新 iter->qp。

返回

0 - iter->qp 有效 1 - 沒有更多 QP

void rvt_qp_iter(struct rvt_dev_info *rdi, u64 v, void (*cb)(struct rvt_qp *qp, u64 v))

迭代所有 QP

引數

struct rvt_dev_info *rdi

rvt devinfo

u64 v

64 位值

void (*cb)(struct rvt_qp *qp, u64 v)

回撥

描述

這提供了一種迭代所有 QP 的方法。

cb 是使用者定義的回撥,v 是傳遞給 cb 並在其中處理的 64 位值。一個用例是基於 rvt_qp 中不包含的標準來更改 QP 處理。

該程式碼有一個內部迭代器,用於簡化非 seq_file 用例。

void rvt_copy_sge(struct rvt_qp *qp, struct rvt_sge_state *ss, void *data, u32 length, bool release, bool copy_last)

將資料複製到 SGE 記憶體

引數

struct rvt_qp *qp

關聯的 QP

struct rvt_sge_state *ss

SGE 狀態

void *data

要複製的資料

u32 length

資料長度

bool release

釋放 MR 的布林值

bool copy_last

單獨複製最後 8 個位元組

void rvt_ruc_loopback(struct rvt_qp *sqp)

處理 UC 和 RC 環回請求

引數

struct rvt_qp *sqp

傳送 QP

描述

這是從 rvt_do_send() 呼叫的,用於轉發定址到同一 HFI 的 WQE 請注意,雖然由於傳送引擎我們是單執行緒的,但我們仍然必須防止 post_send()。我們不必擔心接收中斷,因為這是一種連線的協議,所有資料包都將透過此處。

struct rvt_mcast *rvt_mcast_find(struct rvt_ibport *ibp, union ib_gid *mgid, u16 lid)

在全域性表中搜索給定的多播 GID/LID

引數

struct rvt_ibport *ibp

IB 埠結構

union ib_gid *mgid

要搜尋的多播 GID

u16 lid

多播地址的多播 LID 部分(主機順序)

注意

具有 1 個 MLID 和多個 MGID 是有效的。具有 1 個 MGID 和多個 MLID 是無效的。

描述

如果找到,呼叫方負責遞減引用計數。

返回

如果未找到,則為 NULL。

上層協議

RDMA 的 iSCSI 擴充套件 (iSER)

struct iser_data_buf

iSER 資料緩衝區

定義:

struct iser_data_buf {
    struct scatterlist *sg;
    int size;
    unsigned long      data_len;
    int dma_nents;
};

成員

sg

指向 sg 列表的指標

大小

此 sg 的條目數

data_len

總緩衝區位元組長度

dma_nents

由 dma_map_sg 返回

struct iser_mem_reg

iSER 記憶體註冊資訊

定義:

struct iser_mem_reg {
    struct ib_sge sge;
    u32 rkey;
    struct iser_fr_desc *desc;
};

成員

sge

記憶體區域 sg 元素

rkey

記憶體區域遠端金鑰

desc

指向快速註冊上下文的指標

struct iser_tx_desc

iSER TX 描述符

定義:

struct iser_tx_desc {
    struct iser_ctrl             iser_header;
    struct iscsi_hdr             iscsi_header;
    enum iser_desc_type        type;
    u64 dma_addr;
    struct ib_sge                tx_sg[2];
    int num_sge;
    struct ib_cqe                cqe;
    bool mapped;
    struct ib_reg_wr             reg_wr;
    struct ib_send_wr            send_wr;
    struct ib_send_wr            inv_wr;
};

成員

iser_header

iser 標頭

iscsi_header

iscsi 標頭

type

命令/控制/資料輸出

dma_addr

標頭緩衝區 dma_address

tx_sg

sg[0] 指向 iser/iscsi 標頭,sg[1] 可選擇指向即時資料非請求資料輸出或控制

num_sge

此 TX 任務上使用的 sges 的數量

cqe

完成處理程式

mapped

任務標頭是否已對映

reg_wr

註冊 WR

send_wr

傳送 WR

inv_wr

無效 WR

struct iser_rx_desc

iSER RX 描述符

定義:

struct iser_rx_desc {
    struct iser_ctrl             iser_header;
    struct iscsi_hdr             iscsi_header;
    char data[ISER_RECV_DATA_SEG_LEN];
    u64 dma_addr;
    struct ib_sge                rx_sg;
    struct ib_cqe                cqe;
    char pad[ISER_RX_PAD_SIZE];
};

成員

iser_header

iser 標頭

iscsi_header

iscsi 標頭

data

接收到的資料段

dma_addr

接收緩衝區 dma 地址

rx_sg

接收緩衝區的 ib_sge

cqe

完成處理程式

pad

用於感知資料 TODO:修改為支援的最大感知長度

struct iser_login_desc

iSER 登入描述符

定義:

struct iser_login_desc {
    void *req;
    void *rsp;
    u64 req_dma;
    u64 rsp_dma;
    struct ib_sge                sge;
    struct ib_cqe                cqe;
};

成員

req

指向登入請求緩衝區的指標

rsp

指向登入響應緩衝區的指標

req_dma

登入請求緩衝區的 DMA 地址

rsp_dma

登入響應緩衝區的 DMA 地址

sge

用於登入 post recv 的 IB sge

cqe

完成處理程式

struct iser_device

iSER 裝置控制代碼

定義:

struct iser_device {
    struct ib_device             *ib_device;
    struct ib_pd                 *pd;
    struct ib_event_handler      event_handler;
    struct list_head             ig_list;
    int refcount;
};

成員

ib_device

RDMA 裝置

pd

此裝置的保護域

event_handler

IB 事件處理例程

ig_list

裝置列表中的條目

refcount

引用計數器,由開啟的 iser 連線控制

struct iser_reg_resources

快速註冊資源

定義:

struct iser_reg_resources {
    struct ib_mr                     *mr;
    struct ib_mr                     *sig_mr;
};

成員

mr

記憶體區域

sig_mr

簽名記憶體區域

struct iser_fr_desc

快速註冊描述符

定義:

struct iser_fr_desc {
    struct list_head                  list;
    struct iser_reg_resources         rsc;
    bool sig_protected;
    struct list_head                  all_list;
};

成員

list

連線 fastreg 池中的條目

rsc

資料緩衝區註冊資源

sig_protected

是否為受保護區域的指示器

all_list

第一個和最後一個列表成員

struct iser_fr_pool

連線快速註冊池

定義:

struct iser_fr_pool {
    struct list_head        list;
    spinlock_t lock;
    int size;
    struct list_head        all_list;
};

成員

list

fastreg 描述符列表

保護 fastreg 池

大小

池的大小

all_list

第一個和最後一個列表成員

struct ib_conn

Infiniband 相關物件

定義:

struct ib_conn {
    struct rdma_cm_id           *cma_id;
    struct ib_qp                *qp;
    struct ib_cq                *cq;
    u32 cq_size;
    struct iser_device          *device;
    struct iser_fr_pool          fr_pool;
    bool pi_support;
    struct ib_cqe                reg_cqe;
};

成員

cma_id

rdma_cm 連線管理器控制代碼

qp

連線佇列對

cq

連線完成佇列

cq_size

最大未完成完成的數量

device

對 iser 裝置的引用

fr_pool

連線快速註冊池

pi_support

指示裝置 T10-PI 支援

reg_cqe

完成處理程式

struct iser_conn

iSER 連線上下文

定義:

struct iser_conn {
    struct ib_conn               ib_conn;
    struct iscsi_conn            *iscsi_conn;
    struct iscsi_endpoint        *ep;
    enum iser_conn_state         state;
    unsigned qp_max_recv_dtos;
    u16 max_cmds;
    char name[ISER_OBJECT_NAME_SIZE];
    struct work_struct           release_work;
    struct mutex                 state_mutex;
    struct completion            stop_completion;
    struct completion            ib_completion;
    struct completion            up_completion;
    struct list_head             conn_list;
    struct iser_login_desc       login_desc;
    struct iser_rx_desc          *rx_descs;
    u32 num_rx_descs;
    unsigned short               scsi_sg_tablesize;
    unsigned short               pages_per_mr;
    bool snd_w_inv;
};

成員

ib_conn

連線 RDMA 資源

iscsi_conn

連結到匹配的 iscsi 連線

ep

傳輸控制代碼

state

連線邏輯狀態

qp_max_recv_dtos

最大資料輸出數,對應於最大 post recvs 數

max_cmds

此連線允許的最大命令數

name

連線對等埠

release_work

釋放作業的延遲工作

state_mutex

保護 iser 連線狀態

stop_completion

conn_stop 完成

ib_completion

RDMA 清理完成

up_completion

連線建立完成(狀態為 ISER_CONN_UP)

conn_list

在 ig 連線列表中的條目

login_desc

登入描述符

rx_descs

rx 緩衝區陣列(迴圈緩衝區)

num_rx_descs

rx 描述符的數量

scsi_sg_tablesize

scsi 主機 sg_tablesize

pages_per_mr

可註冊的最大頁面數

snd_w_inv

連線使用遠端失效

struct iscsi_iser_task

iser 任務上下文

定義:

struct iscsi_iser_task {
    struct iser_tx_desc          desc;
    struct iser_conn             *iser_conn;
    enum iser_task_status        status;
    struct scsi_cmnd             *sc;
    int command_sent;
    int dir[ISER_DIRS_NUM];
    struct iser_mem_reg          rdma_reg[ISER_DIRS_NUM];
    struct iser_data_buf         data[ISER_DIRS_NUM];
    struct iser_data_buf         prot[ISER_DIRS_NUM];
};

成員

desc

TX 描述符

iser_conn

連結到 iser 連線

status

當前任務狀態

sc

連結到 scsi 命令

command_sent

指示是否傳送了命令

dir

iser 資料方向

rdma_reg

任務 rdma 註冊描述

data

iser 資料緩衝區描述

prot

iser 保護緩衝區描述

struct iser_global

iSER 全域性上下文

定義:

struct iser_global {
    struct mutex      device_list_mutex;
    struct list_head  device_list;
    struct mutex      connlist_mutex;
    struct list_head  connlist;
    struct kmem_cache *desc_cache;
};

成員

device_list_mutex

保護 device_list

device_list

iser 裝置全域性列表

connlist_mutex

保護 connlist

connlist

iser 連線全域性列表

desc_cache

tx dataout 的 kmem 快取

int iscsi_iser_pdu_alloc(struct iscsi_task *task, uint8_t opcode)

分配一個 iscsi-iser PDU

引數

struct iscsi_task *task

iscsi 任務

uint8_t opcode

iscsi 命令 opcode

描述

注意:此例程不會失敗,只需分配 iscsi 任務

hdr 和最大 hdr 大小。

int iser_initialize_task_headers(struct iscsi_task *task, struct iser_tx_desc *tx_desc)

初始化任務標頭

引數

struct iscsi_task *task

iscsi 任務

struct iser_tx_desc *tx_desc

iser tx 描述符

註釋

此例程可能與 scsi 錯誤處理 TMF 的 iser 關閉流程競爭。因此,對於 TMF,我們應該獲取狀態互斥鎖,以避免取消引用可能已終止的 IB 裝置。

int iscsi_iser_task_init(struct iscsi_task *task)

初始化 iscsi-iser 任務

引數

struct iscsi_task *task

iscsi 任務

描述

初始化 scsi 命令或管理命令的任務。

返回

成功時返回零,或者在失敗時返回 -ENOMEM

來初始化任務標頭(dma 對映錯誤)。

int iscsi_iser_mtask_xmit(struct iscsi_conn *conn, struct iscsi_task *task)

xmit 管理(立即)任務

引數

struct iscsi_conn *conn

iscsi 連線

struct iscsi_task *task

任務管理任務

註釋

該函式可以返回 -EAGAIN,在這種情況下,呼叫者必須稍後再次呼叫它,或者恢復。 ‘0’ 返回程式碼表示成功的 xmit。

int iscsi_iser_task_xmit(struct iscsi_task *task)

xmit iscsi-iser 任務

引數

struct iscsi_task *task

iscsi 任務

返回

成功時返回零,或者失敗時升級 $error。

void iscsi_iser_cleanup_task(struct iscsi_task *task)

清理 iscsi-iser 任務

引數

struct iscsi_task *task

iscsi 任務

註釋

如果 RDMA 裝置已為 NULL(可能已在 DEVICE_REMOVAL CM 事件中刪除)

則它將退出而不執行 dma 取消對映。

u8 iscsi_iser_check_protection(struct iscsi_task *task, sector_t *sector)

檢查任務的保護資訊狀態。

引數

struct iscsi_task *task

iscsi 任務

sector_t *sector

如果存在錯誤扇區(輸出)

返回

如果沒有發生資料完整性錯誤,則為零

0x1:在防護塊中發生資料完整性錯誤 0x2:在引用標記中發生資料完整性錯誤 0x3:在應用程式標記中發生資料完整性錯誤

此外,錯誤扇區被標記。

struct iscsi_cls_conn *iscsi_iser_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx)

建立一個新的 iscsi-iser 連線

引數

struct iscsi_cls_session *cls_session

iscsi 類連線

uint32_t conn_idx

會話中的連線索引(對於 MCS)

返回

當 iscsi_conn_setup 成功時為 iscsi_cls_conn,否則為 NULL

否則。

int iscsi_iser_conn_bind(struct iscsi_cls_session *cls_session, struct iscsi_cls_conn *cls_conn, uint64_t transport_eph, int is_leading)

繫結 iscsi 和 iser 連線結構

引數

struct iscsi_cls_session *cls_session

iscsi 類會話

struct iscsi_cls_conn *cls_conn

iscsi 類連線

uint64_t transport_eph

傳輸端點控制代碼

int is_leading

指示這是否是會話主導連線 (MCS)

返回

成功時返回零,如果 iscsi_conn_bind 失敗則返回 $error 並且

如果端點不再存在或 iser 連線狀態不是 UP(已啟動關閉),則返回 -EINVAL。

int iscsi_iser_conn_start(struct iscsi_cls_conn *cls_conn)

啟動 iscsi-iser 連線

引數

struct iscsi_cls_conn *cls_conn

iscsi 類連線

註釋

這裡 iser 初始化(或重新初始化)stop_completion 為

從這一點開始,iscsi 必須在會話/連線關閉時呼叫 conn_stop,因此 iser 傳輸必須等待它。

void iscsi_iser_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)

停止 iscsi-iser 連線

引數

struct iscsi_cls_conn *cls_conn

iscsi 類連線

int flag

指示是恢復還是終止(按原樣傳遞)

註釋

呼叫 iscsi_conn_stop 在理論上可能與

DEVICE_REMOVAL 事件競爭並取消引用先前釋放的 RDMA 裝置控制代碼,因此我們在 iser 狀態鎖下呼叫它以防止此類競爭。

void iscsi_iser_session_destroy(struct iscsi_cls_session *cls_session)

銷燬 iscsi-iser 會話

引數

struct iscsi_cls_session *cls_session

iscsi 類會話

描述

刪除並釋放 iscsi 主機。

struct iscsi_cls_session *iscsi_iser_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max, uint16_t qdepth, uint32_t initial_cmdsn)

建立一個 iscsi-iser 會話

引數

struct iscsi_endpoint *ep

iscsi 端點控制代碼

uint16_t cmds_max

此會話中的最大命令數

uint16_t qdepth

會話命令佇列深度

uint32_t initial_cmdsn

啟動器命令序列號

描述

分配並新增 scsi 主機,公開 DIF 支援(如果存在),並設定 iscsi 會話。

struct iscsi_endpoint *iscsi_iser_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr, int non_blocking)

啟動 iSER 連線建立

引數

struct Scsi_Host *shost

scsi_host

struct sockaddr *dst_addr

目標地址

int non_blocking

指示例程是否可以阻塞

描述

分配一個 iscsi 端點、一個 iser_conn 結構並繫結它們。之後,透過 rdma_cm 啟動 RDMA 連線建立。我們不分配嵌入在 iscsi_endpoint 中的 iser_conn,因為在關閉時,端點將在 ep_disconnect 時被銷燬,而 iser_conn 將非同步清理其資源。

返回

iscsi 層建立的 iscsi_endpoint 或 ERR_PTR(error)

如果失敗。

int iscsi_iser_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)

輪詢以使 iser 連線建立完成

引數

struct iscsi_endpoint *ep

iscsi 端點(在 ep_connect 時建立)

int timeout_ms

允許的輪詢超時時間(以毫秒為單位)。

描述

此例程歸結為等待 up_completion 發出 cma_id 收到 CONNECTED 事件的訊號。

返回

如果連線建立成功則為 1,如果超時過期則為 0

(libiscsi 將重試)或者如果被訊號中斷,或者更可能是 iser 連線狀態在等待期間轉換為 TEMINATING 或 DOWN,則為 -1。

void iscsi_iser_ep_disconnect(struct iscsi_endpoint *ep)

啟動連線關閉過程

引數

struct iscsi_endpoint *ep

iscsi 端點控制代碼

描述

此例程不會被 iser 和 RDMA 終止過程完成阻塞,因為我們為 iser/RDMA 銷燬和清理排隊了一個延遲工作,或者實際上在我們沒有透過 iscsi conn 繫結/啟動階段的情況下立即呼叫它,因此它是安全的。

int iser_send_command(struct iscsi_conn *conn, struct iscsi_task *task)

傳送命令 PDU

引數

struct iscsi_conn *conn

連結到匹配的 iscsi 連線

struct iscsi_task *task

SCSI 命令任務

int iser_send_data_out(struct iscsi_conn *conn, struct iscsi_task *task, struct iscsi_data *hdr)

傳送資料輸出 PDU

引數

struct iscsi_conn *conn

連結到匹配的 iscsi 連線

struct iscsi_task *task

SCSI 命令任務

struct iscsi_data *hdr

指向 LLD 的 iSCSI 訊息頭的指標

int iser_alloc_fastreg_pool(struct ib_conn *ib_conn, unsigned cmds_max, unsigned int size)

為快速註冊工作請求建立 fast_reg 描述符池。

引數

struct ib_conn *ib_conn

連線 RDMA 資源

unsigned cmds_max

此連線的最大 SCSI 命令數

unsigned int size

每次對映請求的最大頁數

返回

成功時為 0,失敗時為 errno 程式碼

void iser_free_fastreg_pool(struct ib_conn *ib_conn)

釋放 fast_reg 描述符池

引數

struct ib_conn *ib_conn

連線 RDMA 資源

void iser_free_ib_conn_res(struct iser_conn *iser_conn, bool destroy)

釋放 IB 相關資源

引數

struct iser_conn *iser_conn

iser 連線結構體

bool destroy

指示是否需要嘗試釋放 iser 裝置和記憶體區域池(僅 iscsi 關閉和 DEVICE_REMOVAL 會使用此功能)。

描述

此例程在持有 iser 狀態互斥鎖的情況下呼叫,因此 cm_id 刪除已從此處移除。可以安全地多次呼叫。

void iser_conn_release(struct iser_conn *iser_conn)

釋放所有 conn 物件並取消分配 conn 描述符

引數

struct iser_conn *iser_conn

iSER 連線上下文

int iser_conn_terminate(struct iser_conn *iser_conn)

觸發斷開連線過程的開始並等待它們完成

引數

struct iser_conn *iser_conn

iSER 連線上下文

描述

在持有狀態互斥鎖的情況下呼叫

int iser_post_send(struct ib_conn *ib_conn, struct iser_tx_desc *tx_desc)

啟動傳送 DTO 操作

引數

struct ib_conn *ib_conn

連線 RDMA 資源

struct iser_tx_desc *tx_desc

iSER TX 描述符

返回

成功時為 0,失敗時為 -1

Omni-Path (OPA) 虛擬 NIC 支援

struct opa_vnic_ctrl_port

OPA 虛擬 NIC 控制埠

定義:

struct opa_vnic_ctrl_port {
    struct ib_device           *ibdev;
    struct opa_vnic_ctrl_ops   *ops;
    u8 num_ports;
};

成員

ibdev

指向 ib 裝置的指標

ops

opa vnic 控制操作

num_ports

opa 埠的數量

struct opa_vnic_adapter

OPA VNIC netdev 私有資料結構

定義:

struct opa_vnic_adapter {
    struct net_device             *netdev;
    struct ib_device              *ibdev;
    struct opa_vnic_ctrl_port     *cport;
    const struct net_device_ops   *rn_ops;
    u8 port_num;
    u8 vport_num;
    struct mutex lock;
    struct __opa_veswport_info  info;
    u8 vema_mac_addr[ETH_ALEN];
    u32 umac_hash;
    u32 mmac_hash;
    struct hlist_head  __rcu   *mactbl;
    struct mutex mactbl_lock;
    spinlock_t stats_lock;
    u8 flow_tbl[OPA_VNIC_FLOW_TBL_SIZE];
    unsigned long trap_timeout;
    u8 trap_count;
};

成員

netdev

指向關聯 netdev 的指標

ibdev

ib 裝置

cport

指向 opa vnic 控制埠的指標

rn_ops

rdma netdev 的 net_device_ops

port_num

OPA 埠號

vport_num

vesw 埠號

介面卡鎖

info

虛擬乙太網交換機埠資訊

vema_mac_addr

由 vema 配置的 MAC 地址

umac_hash

單播 MAC 列表雜湊

mmac_hash

多播 MAC 列表雜湊

mactbl

MAC 條目的雜湊表

mactbl_lock

MAC 表鎖

stats_lock

統計資訊鎖

flow_tbl

流到預設埠重定向表

trap_timeout

陷阱超時

trap_count

超時期間允許的陷阱數量

struct opa_vnic_mac_tbl_node

OPA VNIC MAC 表節點

定義:

struct opa_vnic_mac_tbl_node {
    struct hlist_node                    hlist;
    u16 index;
    struct __opa_vnic_mactable_entry     entry;
};

成員

hlist

雜湊列表控制代碼

index

MAC 表中條目的索引

entry

表中的條目

struct opa_vesw_info

OPA vnic 交換機資訊

定義:

struct opa_vesw_info {
    __be16 fabric_id;
    __be16 vesw_id;
    u8 rsvd0[6];
    __be16 def_port_mask;
    u8 rsvd1[2];
    __be16 pkey;
    u8 rsvd2[4];
    __be32 u_mcast_dlid;
    __be32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT];
    __be32 rc;
    u8 rsvd3[56];
    __be16 eth_mtu;
    u8 rsvd4[2];
};

成員

fabric_id

10 位結構 ID

vesw_id

12 位虛擬乙太網交換機 ID

rsvd0

保留位元組

def_port_mask

預設埠的位掩碼

rsvd1

保留位元組

pkey

分割槽金鑰

rsvd2

保留位元組

u_mcast_dlid

未知多播 dlid

u_ucast_dlid

未知單播 dlid 陣列

rc

路由控制

rsvd3

保留位元組

eth_mtu

乙太網 MTU

rsvd4

保留位元組

struct opa_per_veswport_info

OPA vnic 每個埠的資訊

定義:

struct opa_per_veswport_info {
    __be32 port_num;
    u8 eth_link_status;
    u8 rsvd0[3];
    u8 base_mac_addr[ETH_ALEN];
    u8 config_state;
    u8 oper_state;
    __be16 max_mac_tbl_ent;
    __be16 max_smac_ent;
    __be32 mac_tbl_digest;
    u8 rsvd1[4];
    __be32 encap_slid;
    u8 pcp_to_sc_uc[OPA_VNIC_MAX_NUM_PCP];
    u8 pcp_to_vl_uc[OPA_VNIC_MAX_NUM_PCP];
    u8 pcp_to_sc_mc[OPA_VNIC_MAX_NUM_PCP];
    u8 pcp_to_vl_mc[OPA_VNIC_MAX_NUM_PCP];
    u8 non_vlan_sc_uc;
    u8 non_vlan_vl_uc;
    u8 non_vlan_sc_mc;
    u8 non_vlan_vl_mc;
    u8 rsvd2[48];
    __be16 uc_macs_gen_count;
    __be16 mc_macs_gen_count;
    u8 rsvd3[8];
};

成員

port_num

埠號

eth_link_status

當前乙太網鏈路狀態

rsvd0

保留位元組

base_mac_addr

基本 MAC 地址

config_state

配置的埠狀態

oper_state

執行埠狀態

max_mac_tbl_ent

MAC 表條目的最大數量

max_smac_ent

MAC 表中的最大 smac 條目數

mac_tbl_digest

MAC 表摘要

rsvd1

保留位元組

encap_slid

埠的基本 slid

pcp_to_sc_uc

按 pcp 索引劃分的 sc,用於單播乙太網資料包

pcp_to_vl_uc

按 pcp 索引劃分的 vl,用於單播乙太網資料包

pcp_to_sc_mc

按 pcp 索引劃分的 sc,用於多播乙太網資料包

pcp_to_vl_mc

按 pcp 索引劃分的 vl,用於多播乙太網資料包

non_vlan_sc_uc

用於非 vlan 單播乙太網資料包的 sc

non_vlan_vl_uc

用於非 vlan 單播乙太網資料包的 vl

non_vlan_sc_mc

用於非 vlan 多播乙太網資料包的 sc

non_vlan_vl_mc

用於非 vlan 多播乙太網資料包的 vl

rsvd2

保留位元組

uc_macs_gen_count

單播 mac 列表的生成計數

mc_macs_gen_count

多播 mac 列表的生成計數

rsvd3

保留位元組

struct opa_veswport_info

OPA vnic 埠資訊

定義:

struct opa_veswport_info {
    struct opa_vesw_info          vesw;
    struct opa_per_veswport_info  vport;
};

成員

vesw

OPA vnic 交換機資訊

vport

OPA vnic 每個埠的資訊

描述

在主機上,每個虛擬乙太網埠都屬於不同的虛擬乙太網交換機。

struct opa_veswport_mactable_entry

轉發表中的單個條目

定義:

struct opa_veswport_mactable_entry {
    u8 mac_addr[ETH_ALEN];
    u8 mac_addr_mask[ETH_ALEN];
    __be32 dlid_sd;
};

成員

mac_addr

MAC 地址

mac_addr_mask

MAC 地址位掩碼

dlid_sd

匹配的 DLID 和輔助資料

描述

在主機上,每個虛擬乙太網埠都有一個轉發表。這些表用於將 MAC 對映到 LID 和其他資料。有關更多詳細資訊,請參見 struct opa_veswport_mactable_entries。這是單個 mactable 條目的結構

struct opa_veswport_mactable

轉發表陣列

定義:

struct opa_veswport_mactable {
    __be16 offset;
    __be16 num_entries;
    __be32 mac_tbl_digest;
    struct opa_veswport_mactable_entry  tbl_entries[];
};

成員

offset

MAC 表起始偏移量

num_entries

要獲取或設定的條目數

mac_tbl_digest

MAC 表摘要

tbl_entries

表條目陣列

描述

EM 在 MAD 中傳送此結構,指示此條目要載入到轉發表中的起始偏移量,以及此 MAD 例項包含的條目數。mac_tbl_digest 已新增到此 MAD 結構中。它將由 EM 設定,並且在 VNIC 埠被刪除或解除安裝的情況下,EM 將使用它來檢查此值與 EM 維護的值是否存在任何差異。VNIC 的新例項始終具有零值。此值作為 vnic 介面卡結構的一部分儲存,並且將由 mactable 條目和 veswport 資訊的 GET 和 SET 例程訪問。

struct opa_veswport_summary_counters

摘要計數器

定義:

struct opa_veswport_summary_counters {
    __be16 vp_instance;
    __be16 vesw_id;
    __be32 veswport_num;
    __be64 tx_errors;
    __be64 rx_errors;
    __be64 tx_packets;
    __be64 rx_packets;
    __be64 tx_bytes;
    __be64 rx_bytes;
    __be64 tx_unicast;
    __be64 tx_mcastbcast;
    __be64 tx_untagged;
    __be64 tx_vlan;
    __be64 tx_64_size;
    __be64 tx_65_127;
    __be64 tx_128_255;
    __be64 tx_256_511;
    __be64 tx_512_1023;
    __be64 tx_1024_1518;
    __be64 tx_1519_max;
    __be64 rx_unicast;
    __be64 rx_mcastbcast;
    __be64 rx_untagged;
    __be64 rx_vlan;
    __be64 rx_64_size;
    __be64 rx_65_127;
    __be64 rx_128_255;
    __be64 rx_256_511;
    __be64 rx_512_1023;
    __be64 rx_1024_1518;
    __be64 rx_1519_max;
    __be64 reserved[16];
};

成員

vp_instance

OPA 埠上的 vport 例項

vesw_id

虛擬乙太網交換機 ID

veswport_num

虛擬乙太網交換機埠號

tx_errors

傳輸錯誤

rx_errors

接收錯誤

tx_packets

傳輸的資料包

rx_packets

接收的資料包

tx_bytes

傳輸的位元組數

rx_bytes

接收的位元組數

tx_unicast

傳輸的單播資料包

tx_mcastbcast

傳輸的多播/廣播資料包

tx_untagged

傳輸的非 vlan 資料包

tx_vlan

傳輸的 vlan 資料包

tx_64_size

傳輸資料包長度為 64 位元組

tx_65_127

傳輸資料包長度 >=65 且 < 127 位元組

tx_128_255

傳輸資料包長度 >=128 且 < 255 位元組

tx_256_511

傳輸資料包長度 >=256 且 < 511 位元組

tx_512_1023

傳輸資料包長度 >=512 且 < 1023 位元組

tx_1024_1518

傳輸資料包長度 >=1024 且 < 1518 位元組

tx_1519_max

傳輸資料包長度 >= 1519 位元組

rx_unicast

接收的單播資料包

rx_mcastbcast

接收的多播/廣播資料包

rx_untagged

接收的非 vlan 資料包

rx_vlan

接收的 vlan 資料包

rx_64_size

接收的資料包長度為 64 位元組

rx_65_127

接收的資料包長度 >=65 且 < 127 位元組

rx_128_255

接收的資料包長度 >=128 且 < 255 位元組

rx_256_511

接收的資料包長度 >=256 且 < 511 位元組

rx_512_1023

接收的資料包長度 >=512 且 < 1023 位元組

rx_1024_1518

接收的資料包長度 >=1024 且 < 1518 位元組

rx_1519_max

接收的資料包長度 >= 1519 位元組

reserved

保留位元組

描述

以上所有均為相應條件的計數器。

struct opa_veswport_error_counters

錯誤計數器

定義:

struct opa_veswport_error_counters {
    __be16 vp_instance;
    __be16 vesw_id;
    __be32 veswport_num;
    __be64 tx_errors;
    __be64 rx_errors;
    __be64 rsvd0;
    __be64 tx_smac_filt;
    __be64 rsvd1;
    __be64 rsvd2;
    __be64 rsvd3;
    __be64 tx_dlid_zero;
    __be64 rsvd4;
    __be64 tx_logic;
    __be64 rsvd5;
    __be64 tx_drop_state;
    __be64 rx_bad_veswid;
    __be64 rsvd6;
    __be64 rx_runt;
    __be64 rx_oversize;
    __be64 rsvd7;
    __be64 rx_eth_down;
    __be64 rx_drop_state;
    __be64 rx_logic;
    __be64 rsvd8;
    __be64 rsvd9[16];
};

成員

vp_instance

OPA 埠上的 vport 例項

vesw_id

虛擬乙太網交換機 ID

veswport_num

虛擬乙太網交換機埠號

tx_errors

傳輸錯誤

rx_errors

接收錯誤

rsvd0

保留位元組

tx_smac_filt

smac 過濾器錯誤

rsvd1

保留位元組

rsvd2

保留位元組

rsvd3

保留位元組

tx_dlid_zero

傳輸具有無效 dlid 的資料包

rsvd4

保留位元組

tx_logic

其他傳輸錯誤

rsvd5

保留位元組

tx_drop_state

非轉發埠狀態下的資料包傳輸

rx_bad_veswid

接收具有無效 vesw id 的資料包

rsvd6

保留位元組

rx_runt

接收的乙太網資料包長度 < 64 位元組

rx_oversize

接收的乙太網資料包長度 > MTU 大小

rsvd7

保留位元組

rx_eth_down

介面關閉時接收的資料包

rx_drop_state

非轉發埠狀態下接收的資料包

rx_logic

其他接收錯誤

rsvd8

保留位元組

rsvd9

保留位元組

描述

以上所有均為相應錯誤條件的計數器。

struct opa_veswport_trap

VNIC 傳送到 EM 的陷阱訊息

定義:

struct opa_veswport_trap {
    __be16 fabric_id;
    __be16 veswid;
    __be32 veswportnum;
    __be16 opaportnum;
    u8 veswportindex;
    u8 opcode;
    __be32 reserved;
};

成員

fabric_id

10 位結構 ID

veswid

12 位虛擬乙太網交換機 ID

veswportnum

虛擬交換機上的邏輯埠號

opaportnum

物理埠號(主機上是冗餘的)

veswportindex

基於 opa 埠 0 的交換機埠索引

opcode

操作

reserved

用於對齊的 32 位

描述

VNIC 將向乙太網管理器傳送陷阱訊息,以通知它 VNIC 配置、行為等的變化。這是陷阱有效負載的格式。

struct opa_vnic_iface_mac_entry

MAC 列表中的單個條目

定義:

struct opa_vnic_iface_mac_entry {
    u8 mac_addr[ETH_ALEN];
};

成員

mac_addr

MAC 地址

struct opa_veswport_iface_macs

用於設定全域性管理 MAC 的訊息

定義:

struct opa_veswport_iface_macs {
    __be16 start_idx;
    __be16 num_macs_in_msg;
    __be16 tot_macs_in_lst;
    __be16 gen_count;
    struct opa_vnic_iface_mac_entry entry[];
};

成員

start_idx

第一個條目的位置(從 0 開始)

num_macs_in_msg

此訊息中的 MAC 數量

tot_macs_in_lst

代理擁有的 MAC 總數

gen_count

gen_count,指示更改

entry

MAC 列表條目

描述

與用於設定全域性管理地址的本地管理地址中相同的屬性 ID 和屬性修飾符

struct opa_vnic_vema_mad

通用 VEMA MAD

定義:

struct opa_vnic_vema_mad {
    struct ib_mad_hdr  mad_hdr;
    struct ib_rmpp_hdr rmpp_hdr;
    u8 reserved;
    u8 oui[3];
    u8 data[OPA_VNIC_EMA_DATA];
};

成員

mad_hdr

通用 MAD 標頭

rmpp_hdr

特定於供應商的 MAD 的 RMPP 標頭

reserved

保留位元組

oui

唯一的組織識別符號

data

MAD 資料

struct opa_vnic_notice_attr

通用通知 MAD

定義:

struct opa_vnic_notice_attr {
    u8 gen_type;
    u8 oui_1;
    u8 oui_2;
    u8 oui_3;
    __be16 trap_num;
    __be16 toggle_count;
    __be32 issuer_lid;
    __be32 reserved;
    u8 issuer_gid[16];
    u8 raw_data[64];
};

成員

gen_type

通用/特定位和通知型別

oui_1

供應商 ID 位元組 1

oui_2

供應商 ID 位元組 2

oui_3

供應商 ID 位元組 3

trap_num

陷阱編號

toggle_count

通知切換位和計數值

issuer_lid

陷阱釋出者的 lid

reserved

保留位元組

issuer_gid

釋出者 GID(僅當使用 Report 方法時)

raw_data

陷阱訊息體

struct opa_vnic_vema_mad_trap

通用 VEMA MAD 陷阱

定義:

struct opa_vnic_vema_mad_trap {
    struct ib_mad_hdr            mad_hdr;
    struct ib_rmpp_hdr           rmpp_hdr;
    u8 reserved;
    u8 oui[3];
    struct opa_vnic_notice_attr  notice;
};

成員

mad_hdr

通用 MAD 標頭

rmpp_hdr

特定於供應商的 MAD 的 RMPP 標頭

reserved

保留位元組

oui

唯一的組織識別符號

notice

通知結構

void opa_vnic_vema_report_event(struct opa_vnic_adapter *adapter, u8 event)

傳送陷阱以報告指定的事件

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

u8 event

要報告的事件

描述

此函式呼叫 vema API 以傳送給定事件的陷阱。

void opa_vnic_get_summary_counters(struct opa_vnic_adapter *adapter, struct opa_veswport_summary_counters *cntrs)

獲取摘要計數器

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_veswport_summary_counters *cntrs

指向目標摘要計數器結構的指標

描述

此函式將給定介面卡維護的摘要計數器填充到提供的目標地址。

void opa_vnic_get_error_counters(struct opa_vnic_adapter *adapter, struct opa_veswport_error_counters *cntrs)

獲取錯誤計數器

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_veswport_error_counters *cntrs

指向目標錯誤計數器結構的指標

描述

此函式將給定介面卡維護的錯誤計數器填充到提供的目標地址。

void opa_vnic_get_vesw_info(struct opa_vnic_adapter *adapter, struct opa_vesw_info *info)
  • 獲取 vesw 資訊

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_vesw_info *info

指向目標 vesw info 結構的指標

描述

此函式將給定介面卡維護的 vesw 資訊複製到提供的目標地址。

void opa_vnic_set_vesw_info(struct opa_vnic_adapter *adapter, struct opa_vesw_info *info)
  • 設定 vesw 資訊

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_vesw_info *info

指向 vesw info 結構的指標

描述

此函式使用提供的 vesw 資訊更新給定介面卡維護的 vesw 資訊。保留欄位按原樣儲存並返回到 EM。

void opa_vnic_get_per_veswport_info(struct opa_vnic_adapter *adapter, struct opa_per_veswport_info *info)
  • 獲取每個埠的 vesw 資訊

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_per_veswport_info *info

指向目標 vport info 結構的指標

描述

此函式將給定介面卡維護的每個埠的 vesw 資訊複製到提供的目標地址。請注意,只讀欄位不會被複制。

void opa_vnic_set_per_veswport_info(struct opa_vnic_adapter *adapter, struct opa_per_veswport_info *info)
  • 設定每個埠的 vesw 資訊

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_per_veswport_info *info

指向 vport info 結構的指標

描述

此函式使用提供的每個埠的 vesw 資訊更新給定介面卡維護的每個埠的 vesw 資訊。保留欄位按原樣儲存並返回到 EM。

void opa_vnic_query_mcast_macs(struct opa_vnic_adapter *adapter, struct opa_veswport_iface_macs *macs)

查詢多播 mac 列表

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_veswport_iface_macs *macs

指標 mac 列表

描述

此函式使用介面卡中配置的多播地址填充提供的 mac 列表。

void opa_vnic_query_ucast_macs(struct opa_vnic_adapter *adapter, struct opa_veswport_iface_macs *macs)

查詢單播 mac 列表

引數

struct opa_vnic_adapter *adapter

vnic 埠介面卡

struct opa_veswport_iface_macs *macs

指標 mac 列表

描述

此函式使用介面卡中配置的單播地址填充提供的 mac 列表。

struct opa_vnic_vema_port
  • VNIC VEMA 埠詳細資訊

定義:

struct opa_vnic_vema_port {
    struct opa_vnic_ctrl_port      *cport;
    struct ib_mad_agent            *mad_agent;
    struct opa_class_port_info      class_port_info;
    u64 tid;
    u8 port_num;
    struct xarray                   vports;
    struct ib_event_handler         event_handler;
    struct mutex                    lock;
};

成員

cport

指向埠的指標

mad_agent

指向埠的 mad 代理的指標

class_port_info

類埠資訊。

tid

事務 ID

port_num

OPA 埠號

vports

vnic 埠

event_handler

ib 事件處理程式

介面卡介面鎖

u8 vema_get_vport_num(struct opa_vnic_vema_mad *recvd_mad)
  • 從 MAD 獲取 vnic

引數

struct opa_vnic_vema_mad *recvd_mad

接收到的 MAD

返回

返回 vnic 埠號的值

struct opa_vnic_adapter *vema_get_vport_adapter(struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_port *port)
  • 從收到的 MAD 獲取 vnic 埠介面卡

引數

struct opa_vnic_vema_mad *recvd_mad

接收到的 MAD

struct opa_vnic_vema_port *port

指向接收到 MAD 的埠結構的指標

返回

vnic 介面卡

bool vema_mac_tbl_req_ok(struct opa_veswport_mactable *mac_tbl)
  • 檢查 MAC 請求是否具有正確的值

引數

struct opa_veswport_mactable *mac_tbl

mac 表

描述

此函式檢查所需偏移量和條目數的有效性。

返回

如果 offset 和 num_entries 有效,則為 true

struct opa_vnic_adapter *vema_add_vport(struct opa_vnic_vema_port *port, u8 vport_num)
  • 新增新的 vnic 埠

引數

struct opa_vnic_vema_port *port

指向 opa_vnic_vema_port 結構的指標

u8 vport_num

vnic 埠號(要新增)

描述

返回指向 vnic 介面卡結構的指標

void vema_get_class_port_info(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 獲取埠的類資訊

引數

struct opa_vnic_vema_port *port

在其上接收到 MAD 的埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

描述

此函式複製為埠設定的最新類埠資訊值,並存儲它以生成陷阱

void vema_set_class_port_info(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 獲取埠的類資訊

引數

struct opa_vnic_vema_port *port

在其上接收到 MAD 的埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

描述

此函式更新特定 vnic 的埠類資訊並設定響應 MAD 資料

void vema_get_veswport_info(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 獲取 veswport 資訊

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

void vema_set_veswport_info(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 設定 veswport 資訊

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

描述

此函式獲取 vnic 的埠類資訊

void vema_get_mac_entries(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 獲取 VNIC MAC 表中的 MAC 條目

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

描述

此函式獲取已程式設計到 VNIC MAC 轉發表中的 MAC 條目。它檢查 MAC 表中索引的有效性以及要檢索的條目數。

void vema_set_mac_entries(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 設定 VNIC MAC 表中的 MAC 條目

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

描述

此函式設定 VNIC 轉發表中的 MAC 條目。它檢查索引的有效性以及要程式設計的轉發表條目數。

void vema_set_delete_vesw(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 將 VESW 資訊重置為 POD 值

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

指向接收到的 MAD 的指標

struct opa_vnic_vema_mad *rsp_mad

指向響應 MAD 的指標

描述

此函式清除所請求的 vesw 的 veswport 資訊的所有欄位,並將它們設定回上電預設值。它不會刪除 vesw。

void vema_get_mac_list(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad, u16 attr_id)
  • 獲取單播/多播 MAC 地址。

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

收到的 mad 包含用於設定 vnic 引數的欄位

struct opa_vnic_vema_mad *rsp_mad

要構建的響應 mad

u16 attr_id

指示多播或單播 MAC 列表的屬性 ID

void vema_get_summary_counters(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 獲取摘要計數器。

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

收到的 mad 包含用於設定 vnic 引數的欄位

struct opa_vnic_vema_mad *rsp_mad

要構建的響應 mad

void vema_get_error_counters(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 獲取摘要計數器。

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

收到的 mad 包含用於設定 vnic 引數的欄位

struct opa_vnic_vema_mad *rsp_mad

要構建的響應 mad

void vema_get(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 處理收到的 get MAD

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

接收到的 MAD

struct opa_vnic_vema_mad *rsp_mad

要構建的響應 mad

void vema_set(struct opa_vnic_vema_port *port, struct opa_vnic_vema_mad *recvd_mad, struct opa_vnic_vema_mad *rsp_mad)
  • 處理收到的 set MAD

引數

struct opa_vnic_vema_port *port

接收到 MAD 的源埠

struct opa_vnic_vema_mad *recvd_mad

收到的 mad 包含用於設定 vnic 引數的欄位

struct opa_vnic_vema_mad *rsp_mad

要構建的響應 mad

void vema_send(struct ib_mad_agent *mad_agent, struct ib_mad_send_wc *mad_wc)
  • VEMA MAD 代理的傳送處理程式

引數

struct ib_mad_agent *mad_agent

指向 MAD 代理的指標

struct ib_mad_send_wc *mad_wc

指向 MAD 傳送工作完成資訊的指標

描述

釋放與傳送的 MAD 關聯的所有資料結構

void vema_recv(struct ib_mad_agent *mad_agent, struct ib_mad_send_buf *send_buf, struct ib_mad_recv_wc *mad_wc)
  • VEMA MAD 代理的接收處理程式

引數

struct ib_mad_agent *mad_agent

指向 MAD 代理的指標

struct ib_mad_send_buf *send_buf

如果找到傳送緩衝區,否則為 NULL

struct ib_mad_recv_wc *mad_wc

指向 MAD 傳送工作完成資訊的指標

描述

僅處理 set 和 get 方法,並將其他方法響應為不支援。為響應 MAD 分配響應緩衝區和地址控制代碼。

struct opa_vnic_vema_port *vema_get_port(struct opa_vnic_ctrl_port *cport, u8 port_num)
  • 獲取 opa_vnic_vema_port

引數

struct opa_vnic_ctrl_port *cport

指向控制 dev 的指標

u8 port_num

埠號

描述

此函式迴圈遍歷埠,並返回與 OPA 埠號關聯的 opa_vnic_vema 埠結構

返回

指向請求的 opa_vnic_vema_port 結構的指標

如果成功,則為 NULL;否則不成功

void opa_vnic_vema_send_trap(struct opa_vnic_adapter *adapter, struct __opa_veswport_trap *data, u32 lid)
  • 此函式向 EM 傳送陷阱

引數

struct opa_vnic_adapter *adapter

指向 vnic 介面卡的指標

struct __opa_veswport_trap *data

指向由呼叫函式填充的陷阱資料的指標

u32 lid

頒發者的 lid(來自 vesw_port_info 的 encap_slid)

描述

如果 EM 應該收到通知,則從 VNIC 驅動程式呼叫此函式以傳送陷阱。這些事件目前是 1) 單播介面 MACADDRESS 更改 2) 多播介面 MACADDRESS 更改 3) 乙太網鏈路狀態更改 在分配發送 mad 時,使用的遠端站點 qpn 為 1,因為這是眾所周知的 QP。

void vema_unregister(struct opa_vnic_ctrl_port *cport)
  • 取消註冊代理

引數

struct opa_vnic_ctrl_port *cport

指向控制埠的指標

描述

這會刪除 VEMA 針對 MAD 的註冊

int vema_register(struct opa_vnic_ctrl_port *cport)
  • 註冊代理

引數

struct opa_vnic_ctrl_port *cport

指向控制埠的指標

描述

此函式註冊 VEMA MAD 的處理程式

返回

成功時返回 0。否則為非零

void opa_vnic_ctrl_config_dev(struct opa_vnic_ctrl_port *cport, bool en)
  • 此函式透過 ib_modify_port 向 EM 傳送陷阱,以指示對光纖通道上乙太網的支援。

引數

struct opa_vnic_ctrl_port *cport

指向控制埠的指標

bool en

啟用或停用光纖通道上乙太網的支援

int opa_vnic_vema_add_one(struct ib_device *device)
  • 處理新的 IB 裝置

引數

struct ib_device *device

IB 裝置指標

描述

分配 vnic 控制埠並對其進行初始化。

void opa_vnic_vema_rem_one(struct ib_device *device, void *client_data)
  • 處理 ib 裝置移除

引數

struct ib_device *device

IB 裝置指標

void *client_data

ib 客戶端資料

描述

取消初始化並釋放 vnic 控制埠。

InfiniBand SCSI RDMA 協議目標支援

enum srpt_command_state

SRPT 管理的 SCSI 命令狀態

常量

SRPT_STATE_NEW

新命令已到達並正在處理。

SRPT_STATE_NEED_DATA

正在處理寫入或雙向命令,並等待資料到達。

SRPT_STATE_DATA_IN

寫入或雙向命令的資料已到達並正在處理。

SRPT_STATE_CMD_RSP_SENT

SRP_CMD 的 SRP_RSP 已傳送。

SRPT_STATE_MGMT

正在處理 SCSI 任務管理命令。

SRPT_STATE_MGMT_RSP_SENT

SRP_TSK_MGMT 的 SRP_RSP 已傳送。

SRPT_STATE_DONE

命令處理成功完成、命令處理已中止或命令處理失敗。

struct srpt_ioctx

共享的 SRPT I/O 上下文資訊

定義:

struct srpt_ioctx {
    struct ib_cqe           cqe;
    void *buf;
    dma_addr_t dma;
    uint32_t offset;
    uint32_t index;
};

成員

cqe

完成佇列元素。

buf

指向緩衝區的指標。

dma

緩衝區的 DMA 地址。

offset

bufdma 中實際使用的第一個位元組的偏移量。

index

I/O 上下文在其 ioctx_ring 陣列中的索引。

struct srpt_recv_ioctx

SRPT 接收 I/O 上下文

定義:

struct srpt_recv_ioctx {
    struct srpt_ioctx       ioctx;
    struct list_head        wait_list;
    int byte_len;
};

成員

ioctx

見上文。

wait_list

用於插入 srpt_rdma_ch.cmd_wait_list 中的節點。

byte_len

ioctx.buf 中的位元組數。

struct srpt_send_ioctx

SRPT 傳送 I/O 上下文

定義:

struct srpt_send_ioctx {
    struct srpt_ioctx       ioctx;
    struct srpt_rdma_ch     *ch;
    struct srpt_recv_ioctx  *recv_ioctx;
    struct srpt_rw_ctx      s_rw_ctx;
    struct srpt_rw_ctx      *rw_ctxs;
    struct scatterlist      imm_sg;
    struct ib_cqe           rdma_cqe;
    enum srpt_command_state state;
    struct se_cmd           cmd;
    u8 n_rdma;
    u8 n_rw_ctx;
    bool queue_status_only;
    u8 sense_data[TRANSPORT_SENSE_BUFFER];
};

成員

ioctx

見上文。

ch

通道指標。

recv_ioctx

與此傳送 I/O 上下文關聯的接收 I/O 上下文。僅用於處理立即資料。

s_rw_ctx

如果只需要一個 rw_ctx,則 rw_ctxs 指向此處。

rw_ctxs

RDMA 讀取/寫入上下文。

imm_sg

立即資料的散列表。

rdma_cqe

RDMA 完成佇列元素。

state

I/O 上下文狀態。

cmd

目標核心命令資料結構。

n_rdma

傳輸此 ioctx 所需的工作請求數。

n_rw_ctx

rw_ctxs 陣列的大小。

queue_status_only

將 SCSI 狀態傳送回發起程式,但不傳送資料。

sense_data

要傳送給發起程式的感應資料。

enum rdma_ch_state

SRP 通道狀態

常量

CH_CONNECTING

QP 處於 RTR 狀態;等待 RTU。

CH_LIVE

QP 處於 RTS 狀態。

CH_DISCONNECTING

DREQ 已傳送並等待 DREP,或 DREQ 已接收。

CH_DRAINING

DREP 已接收,或等待 DREP 超時,並且最後一個工作請求已排隊。

CH_DISCONNECTED

已接收到最後一個完成。

struct srpt_rdma_ch

RDMA 通道

定義:

struct srpt_rdma_ch {
    struct srpt_nexus       *nexus;
    struct ib_qp            *qp;
    union {
        struct {
            struct ib_cm_id         *cm_id;
        } ib_cm;
        struct {
            struct rdma_cm_id       *cm_id;
        } rdma_cm;
    };
    struct ib_cq            *cq;
    u32 cq_size;
    struct ib_cqe           zw_cqe;
    struct rcu_head         rcu;
    struct kref             kref;
    struct completion       *closed;
    int rq_size;
    u32 max_rsp_size;
    atomic_t sq_wr_avail;
    struct srpt_port        *sport;
    int max_ti_iu_len;
    atomic_t req_lim;
    atomic_t req_lim_delta;
    u16 imm_data_offset;
    spinlock_t spinlock;
    enum rdma_ch_state      state;
    struct kmem_cache       *rsp_buf_cache;
    struct srpt_send_ioctx  **ioctx_ring;
    struct kmem_cache       *req_buf_cache;
    struct srpt_recv_ioctx  **ioctx_recv_ring;
    struct list_head        list;
    struct list_head        cmd_wait_list;
    uint16_t pkey;
    bool using_rdma_cm;
    bool processing_wait_list;
    struct se_session       *sess;
    u8 sess_name[40];
    struct work_struct      release_work;
};

成員

nexus

此通道關聯的 I_T 關係。

qp

用於透過此通道進行通訊的 IB 佇列對。

{unnamed_union}

anonymous

ib_cm

見下文。

ib_cm.cm_id

與通道關聯的 IB CM ID。

rdma_cm

見下文。

rdma_cm.cm_id

與通道關聯的 RDMA CM ID。

cq

此通道的 IB 完成佇列。

cq_size

cq 中的 CQE 數量。

zw_cqe

零長度寫入 CQE。

rcu

RCU 頭。

kref

此通道的 kref。

closed

只要可以建立具有相同身份的新通道物件,就會發出訊號的完成物件。

rq_size

IB 接收佇列大小。

max_rsp_size

RSP 響應訊息的最大大小(以位元組為單位)。

sq_wr_avail

傳送佇列中可用的工作請求數。

sport

指向此通道使用的 HCA 埠資訊的指標。

max_ti_iu_len

目標到發起程式的最大資訊單元長度。

req_lim

請求限制:發起程式在收到響應之前可以傳送的最大請求數。

req_lim_delta

尚未傳送回發起程式的信用額度數。

imm_data_offset

SRP_CMD 的立即資料的偏移量。

spinlock

保護 free_list 和 state。

state

通道狀態。另請參閱 enum rdma_ch_state

rsp_buf_cache

ioctx_ring 的 kmem_cache。

ioctx_ring

傳送環。

req_buf_cache

ioctx_recv_ring 的 kmem_cache。

ioctx_recv_ring

接收 I/O 上下文環。

list

srpt_nexus.ch_list 中的節點。

cmd_wait_list

在 RTU 事件之前到達的 SCSI 命令列表。此列表包含 struct srpt_ioctx 元素,並透過 cm_id 自旋鎖防止併發修改。

pkey

此 SRP 通道的 IB 分割槽的 P_Key。

using_rdma_cm

此通道是使用 RDMA/CM 還是 IB/CM。

processing_wait_list

是否正在處理 cmd_wait_list。

sess

與此 SRP 通道關聯的會話資訊。

sess_name

會話名稱。

release_work

允許排程 srpt_release_channel()。

struct srpt_nexus

I_T 關係

定義:

struct srpt_nexus {
    struct rcu_head         rcu;
    struct list_head        entry;
    struct list_head        ch_list;
    u8 i_port_id[16];
    u8 t_port_id[16];
};

成員

rcu

此資料結構的 RCU 頭。

entry

srpt_port.nexus_list 列表節點。

ch_list

struct srpt_rdma_ch 列表。受 srpt_port.mutex 保護。

i_port_id

從 SRP_LOGIN_REQ 複製的 128 位發起程式埠識別符號。

t_port_id

從 SRP_LOGIN_REQ 複製的 128 位目標埠識別符號。

struct srpt_port_attrib

SRPT 埠的屬性

定義:

struct srpt_port_attrib {
    u32 srp_max_rdma_size;
    u32 srp_max_rsp_size;
    u32 srp_sq_size;
    bool use_srq;
};

成員

srp_max_rdma_size

新連線的 SRP RDMA 傳輸的最大大小。

srp_max_rsp_size

SRP 響應訊息的最大大小(以位元組為單位)。

srp_sq_size

共享接收佇列 (SRQ) 大小。

use_srq

是否使用 SRQ。

struct srpt_tpg

關於單個“目標門戶組”的資訊

定義:

struct srpt_tpg {
    struct list_head        entry;
    struct srpt_port_id     *sport_id;
    struct se_portal_group  tpg;
};

成員

entry

sport_id->tpg_list 中的條目。

sport_id

此 TPG 關聯的埠名稱。

tpg

LIO TPG 資料結構。

描述

零個或多個目標門戶組與每個埠名稱 (srpt_port_id) 關聯。每個 TPG 都有一個 ACL 列表與之關聯。

struct srpt_port_id

LIO RDMA 埠資訊

定義:

struct srpt_port_id {
    struct mutex            mutex;
    struct list_head        tpg_list;
    struct se_wwn           wwn;
    char name[64];
};

成員

mutex

保護 tpg_list 更改。

tpg_list

與 RDMA 埠名稱關聯的 TPG。

wwn

與 RDMA 埠名稱關聯的 WWN。

name

埠名稱的 ASCII 表示形式。

描述

多個 sysfs 目錄可以與單個 RDMA 埠關聯。此資料結構表示單個(埠、名稱)對。

struct srpt_port

SRPT RDMA 埠資訊

定義:

struct srpt_port {
    struct srpt_device      *sdev;
    struct ib_mad_agent     *mad_agent;
    bool enabled;
    u8 port;
    u32 sm_lid;
    u32 lid;
    union ib_gid            gid;
    struct work_struct      work;
    char guid_name[64];
    struct srpt_port_id     *guid_id;
    char gid_name[64];
    struct srpt_port_id     *gid_id;
    struct srpt_port_attrib port_attrib;
    atomic_t refcount;
    struct completion       *freed_channels;
    struct mutex            mutex;
    struct list_head        nexus_list;
};

成員

sdev

指向 HCA 資訊的反向指標。

mad_agent

每個埠的管理資料報處理資訊。

enabled

是否啟用了此目標埠。

port

從 1 開始的埠號。

sm_lid

埠的 sm_lid 的快取值。

lid

埠的 lid 的快取值。

gid

埠的 gid 的快取值。

work

用於重新整理上述快取值的工作結構。

guid_name

GUID 格式的埠名稱。

guid_id

GUID 格式的埠名稱的 LIO 目標埠資訊。

gid_name

GID 格式的埠名稱。

gid_id

GID 格式的埠名稱的 LIO 目標埠資訊。

port_attrib

可以透過 configfs 訪問的埠屬性。

refcount

與此埠關聯的物件數。

freed_channels

一旦 refcount 變為 0,就會發出訊號的完成。

mutex

保護 nexus_list。

nexus_list

關係列表。另請參閱 srpt_nexus.entry。

struct srpt_device

SRPT 與單個 HCA 關聯的資訊

定義:

struct srpt_device {
    struct kref             refcnt;
    struct ib_device        *device;
    struct ib_pd            *pd;
    u32 lkey;
    struct ib_srq           *srq;
    struct ib_cm_id         *cm_id;
    int srq_size;
    struct mutex            sdev_mutex;
    bool use_srq;
    struct kmem_cache       *req_buf_cache;
    struct srpt_recv_ioctx  **ioctx_ring;
    struct ib_event_handler event_handler;
    struct list_head        list;
    struct srpt_port        port[];
};

成員

refcnt

此裝置的引用計數。

device

指向 IB 核心管理的 struct ib_device 的反向指標。

pd

IB 保護域。

lkey

具有對所有本地記憶體的寫入許可權的 L_Key(本地金鑰)。

srq

每個 HCA 的 SRQ(共享接收佇列)。

cm_id

連線識別符號。

srq_size

SRQ 大小。

sdev_mutex

序列化 use_srq 更改。

use_srq

是否使用 SRQ。

req_buf_cache

ioctx_ring 緩衝區的 kmem_cache。

ioctx_ring

每個 HCA 的 SRQ。

event_handler

每個 HCA 的非同步 IB 事件處理程式。

list

srpt_dev_list 中的節點。

port

有關此 HCA 擁有的埠的資訊。

void srpt_event_handler(struct ib_event_handler *handler, struct ib_event *event)

非同步 IB 事件回撥函式

引數

struct ib_event_handler *handler

ib_register_event_handler() 註冊的 IB 事件處理程式。

struct ib_event *event

發生的事件的描述。

描述

當發生非同步 IB 事件時,由 InfiniBand 核心呼叫的回撥函式。此回撥可能在中斷上下文中發生。另請參閱 InfiniBand 架構規範中的 11.5.2 節,設定非同步事件處理程式。

void srpt_srq_event(struct ib_event *event, void *ctx)

SRQ 事件回撥函式

引數

struct ib_event *event

發生的事件的描述。

void *ctx

在 SRQ 建立時指定的上下文指標。

void srpt_qp_event(struct ib_event *event, void *ptr)

QP 事件回撥函式

引數

struct ib_event *event

發生的事件的描述。

void *ptr

SRPT RDMA 通道。

void srpt_set_ioc(u8 *c_list, u32 slot, u8 value)

初始化 IOUnitInfo 結構

引數

u8 *c_list

控制器列表。

u32 slot

從 1 開始的槽號。

u8 value

四位值。

描述

將值中最低的四位複製到名為 c_list(控制器列表)的四位元素陣列的元素槽中。索引槽從 1 開始。

void srpt_get_class_port_info(struct ib_dm_mad *mad)

將 ClassPortInfo 複製到管理資料報

引數

struct ib_dm_mad *mad

將作為對 DM_ATTR_CLASS_PORT_INFO 的響應傳送的資料報。

描述

另請參閱 InfiniBand 架構規範中的 16.3.3.1 節 ClassPortInfo。

void srpt_get_iou(struct ib_dm_mad *mad)

將 IOUnitInfo 寫入管理資料報

引數

struct ib_dm_mad *mad

將作為對 DM_ATTR_IOU_INFO 的響應傳送的資料報。

描述

另請參閱 InfiniBand 架構規範中的 16.3.3.3 節 IOUnitInfo。另請參閱 SRP r16a 文件中的 B.7 節,表 B.6。

void srpt_get_ioc(struct srpt_port *sport, u32 slot, struct ib_dm_mad *mad)

將 IOControllerprofile 寫入管理資料報

引數

struct srpt_port *sport

透過其接收 MAD 的 HCA 埠。

u32 slot

在DM_ATTR_IOC_PROFILE查詢中指定的槽位號。

struct ib_dm_mad *mad

將作為對DM_ATTR_IOC_PROFILE的響應傳送的資料報。

描述

另請參閱InfiniBand架構規範中的第16.3.3.4節IOControllerProfile。另請參閱SRP r16a文件中的B.7節,表B.7。

void srpt_get_svc_entries(u64 ioc_guid, u16 slot, u8 hi, u8 lo, struct ib_dm_mad *mad)

將ServiceEntries寫入管理資料報

引數

u64 ioc_guid

在回覆中使用的I/O控制器GUID。

u16 slot

I/O控制器編號。

u8 hi

要在回覆中指定的ServiceEntries範圍的結束。

u8 lo

要在回覆中指定的ServiceEntries範圍的開始。

struct ib_dm_mad *mad

將作為對DM_ATTR_SVC_ENTRIES的響應傳送的資料報。

描述

另請參閱InfiniBand架構規範中的第16.3.3.5節ServiceEntries。另請參閱SRP r16a文件中的B.7節,表B.8。

void srpt_mgmt_method_get(struct srpt_port *sp, struct ib_mad *rq_mad, struct ib_dm_mad *rsp_mad)

處理收到的管理資料報

引數

struct srpt_port *sp

透過其接收 MAD 的 HCA 埠。

struct ib_mad *rq_mad

收到的MAD。

struct ib_dm_mad *rsp_mad

響應MAD。

void srpt_mad_send_handler(struct ib_mad_agent *mad_agent, struct ib_mad_send_wc *mad_wc)

MAD傳送完成回撥

引數

struct ib_mad_agent *mad_agent

ib_register_mad_agent()的返回值。

struct ib_mad_send_wc *mad_wc

報告MAD已傳送的工作完成。

void srpt_mad_recv_handler(struct ib_mad_agent *mad_agent, struct ib_mad_send_buf *send_buf, struct ib_mad_recv_wc *mad_wc)

MAD接收回調函式

引數

struct ib_mad_agent *mad_agent

ib_register_mad_agent()的返回值。

struct ib_mad_send_buf *send_buf

未使用。

struct ib_mad_recv_wc *mad_wc

報告已收到MAD的工作完成。

int srpt_refresh_port(struct srpt_port *sport)

配置HCA埠

引數

struct srpt_port *sport

SRPT HCA埠。

描述

啟用InfiniBand管理資料報處理,更新快取的sm_lid、lid和gid值,併為指定埠上的MAD處理註冊回撥函式。

注意

對於同一埠,多次呼叫此函式是安全的。

void srpt_unregister_mad_agent(struct srpt_device *sdev, int port_cnt)

登出MAD回撥函式

引數

struct srpt_device *sdev

SRPT HCA指標。

int port_cnt

註冊MAD的埠數量

注意

對於同一裝置,多次呼叫此函式是安全的。

struct srpt_ioctx *srpt_alloc_ioctx(struct srpt_device *sdev, int ioctx_size, struct kmem_cache *buf_cache, enum dma_data_direction dir)

分配一個SRPT I/O上下文結構

引數

struct srpt_device *sdev

SRPT HCA指標。

int ioctx_size

I/O上下文大小。

struct kmem_cache *buf_cache

I/O緩衝區快取。

enum dma_data_direction dir

DMA資料方向。

void srpt_free_ioctx(struct srpt_device *sdev, struct srpt_ioctx *ioctx, struct kmem_cache *buf_cache, enum dma_data_direction dir)

釋放一個SRPT I/O上下文結構

引數

struct srpt_device *sdev

SRPT HCA指標。

struct srpt_ioctx *ioctx

I/O上下文指標。

struct kmem_cache *buf_cache

I/O緩衝區快取。

enum dma_data_direction dir

DMA資料方向。

struct srpt_ioctx **srpt_alloc_ioctx_ring(struct srpt_device *sdev, int ring_size, int ioctx_size, struct kmem_cache *buf_cache, int alignment_offset, enum dma_data_direction dir)

分配一個SRPT I/O上下文結構環

引數

struct srpt_device *sdev

分配I/O上下文環的裝置。

int ring_size

I/O上下文環中的元素數量。

int ioctx_size

I/O上下文大小。

struct kmem_cache *buf_cache

I/O緩衝區快取。

int alignment_offset

SRP資訊單元開始的每個環形緩衝區中的偏移量。

enum dma_data_direction dir

DMA資料方向。

void srpt_free_ioctx_ring(struct srpt_ioctx **ioctx_ring, struct srpt_device *sdev, int ring_size, struct kmem_cache *buf_cache, enum dma_data_direction dir)

釋放SRPT I/O上下文結構環

引數

struct srpt_ioctx **ioctx_ring

要釋放的I/O上下文環。

struct srpt_device *sdev

SRPT HCA指標。

int ring_size

環形元素數量。

struct kmem_cache *buf_cache

I/O緩衝區快取。

enum dma_data_direction dir

DMA資料方向。

enum srpt_command_state srpt_set_cmd_state(struct srpt_send_ioctx *ioctx, enum srpt_command_state new)

設定SCSI命令的狀態

引數

struct srpt_send_ioctx *ioctx

傳送I/O上下文。

enum srpt_command_state new

新的I/O上下文狀態。

描述

不修改中止命令的狀態。返回之前的命令狀態。

bool srpt_test_and_set_cmd_state(struct srpt_send_ioctx *ioctx, enum srpt_command_state old, enum srpt_command_state new)

測試並設定命令的狀態

引數

struct srpt_send_ioctx *ioctx

傳送I/O上下文。

enum srpt_command_state old

當前的I/O上下文狀態。

enum srpt_command_state new

新的I/O上下文狀態。

描述

當且僅當之前的命令狀態等於“old”時,才返回true。

int srpt_post_recv(struct srpt_device *sdev, struct srpt_rdma_ch *ch, struct srpt_recv_ioctx *ioctx)

釋出IB接收請求

引數

struct srpt_device *sdev

SRPT HCA指標。

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

struct srpt_recv_ioctx *ioctx

接收I/O上下文指標。

int srpt_zerolength_write(struct srpt_rdma_ch *ch)

執行零長度RDMA寫入

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

描述

來自InfiniBand規範的引用:C9-88:對於使用可靠連線服務的HCA響應器,對於每個零長度RDMA READ或WRITE請求,即使請求包含立即資料,也不應驗證R_Key。

int srpt_get_desc_tbl(struct srpt_recv_ioctx *recv_ioctx, struct srpt_send_ioctx *ioctx, struct srp_cmd *srp_cmd, enum dma_data_direction *dir, struct scatterlist **sg, unsigned int *sg_cnt, u64 *data_len, u16 imm_data_offset)

解析SRP_CMD請求的資料描述符

引數

struct srpt_recv_ioctx *recv_ioctx

與接收到的命令srp_cmd關聯的I/O上下文。

struct srpt_send_ioctx *ioctx

將用於響應啟動器的I/O上下文。

struct srp_cmd *srp_cmd

指向SRP_CMD請求資料的指標。

enum dma_data_direction *dir

指向將寫入傳輸方向的變數的指標。

struct scatterlist **sg

[輸出]已解析SRP_CMD的散列表。

unsigned int *sg_cnt

[輸出] sg的長度。

u64 *data_len

指向將寫入SRP_CMD請求中所有描述符的總資料長度的變數的指標。

u16 imm_data_offset

[輸入]立即資料開始的SRP_CMD請求中的偏移量。

描述

此函式初始化ioctx->nrbuf和ioctx->r_bufs。

當SRP_CMD請求包含不一致的描述符時,返回-EINVAL;當記憶體分配失敗時,返回-ENOMEM;成功時,返回零。

int srpt_init_ch_qp(struct srpt_rdma_ch *ch, struct ib_qp *qp)

初始化佇列對屬性

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

struct ib_qp *qp

佇列對指標。

描述

透過允許本地寫、遠端讀和遠端寫,初始化佇列對“qp”的屬性。 同時將“qp”轉換到 IB_QPS_INIT 狀態。

int srpt_ch_qp_rtr(struct srpt_rdma_ch *ch, struct ib_qp *qp)

將通道的狀態更改為“準備接收”(RTR)

引數

struct srpt_rdma_ch *ch

佇列對的通道。

struct ib_qp *qp

要更改狀態的佇列對。

描述

成功時返回零,失敗時返回負值。

注意

當前,struct ib_qp_attr 在 64 位系統上佔用 136 位元組。 如果此結構變得更大,則可能需要動態分配它,而不是在堆疊上分配。

int srpt_ch_qp_rts(struct srpt_rdma_ch *ch, struct ib_qp *qp)

將通道的狀態更改為“準備傳送”(RTS)

引數

struct srpt_rdma_ch *ch

佇列對的通道。

struct ib_qp *qp

要更改狀態的佇列對。

描述

成功時返回零,失敗時返回負值。

注意

當前,struct ib_qp_attr 在 64 位系統上佔用 136 位元組。 如果此結構變得更大,則可能需要動態分配它,而不是在堆疊上分配。

int srpt_ch_qp_err(struct srpt_rdma_ch *ch)

將通道佇列對狀態設定為“錯誤”

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

struct srpt_send_ioctx *srpt_get_send_ioctx(struct srpt_rdma_ch *ch)

獲取用於傳送到啟動器的 I/O 上下文

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)

中止 SCSI 命令

引數

struct srpt_send_ioctx *ioctx

與 SCSI 命令關聯的 I/O 上下文。

void srpt_rdma_read_done(struct ib_cq *cq, struct ib_wc *wc)

RDMA 讀取完成回撥

引數

struct ib_cq *cq

完成佇列。

struct ib_wc *wc

工作完成。

描述

XXX:現在 target_execute_cmd 曾經是非同步的,並且透過 IB RDMA 傳輸的資料的取消對映必須推遲到 check_stop_free() 回撥。 所有這些都不再必要,需要清理。

int srpt_build_cmd_rsp(struct srpt_rdma_ch *ch, struct srpt_send_ioctx *ioctx, u64 tag, int status)

構建 SRP_RSP 響應

引數

struct srpt_rdma_ch *ch

接收請求的 RDMA 通道。

struct srpt_send_ioctx *ioctx

與 SRP_CMD 請求關聯的 I/O 上下文。 響應將在 ioctx->buf 指向的緩衝區中構建,因此此函式將覆蓋請求資料。

u64 tag

為其生成此響應的請求的標記。

int status

SRP_RSP 資訊單元的 STATUS 欄位的值。

描述

返回 SRP_RSP 響應的大小(以位元組為單位)。

SRP_RSP 響應包含 SCSI 狀態或服務響應。 有關 SRP_RSP 響應的格式,另請參見 SRP r16a 文件中的第 6.9 節。 有關感知資料的更多資訊,另請參見 SPC-2。

int srpt_build_tskmgmt_rsp(struct srpt_rdma_ch *ch, struct srpt_send_ioctx *ioctx, u8 rsp_code, u64 tag)

構建任務管理響應

引數

struct srpt_rdma_ch *ch

接收請求的 RDMA 通道。

struct srpt_send_ioctx *ioctx

將在其中構建 SRP_RSP 響應的 I/O 上下文。

u8 rsp_code

將儲存在響應中的 RSP_CODE。

u64 tag

為其生成此響應的請求的標記。

描述

返回 SRP_RSP 響應的大小(以位元組為單位)。

SRP_RSP 響應包含 SCSI 狀態或服務響應。 有關 SRP_RSP 響應的格式,另請參見 SRP r16a 文件中的第 6.9 節。

void srpt_handle_cmd(struct srpt_rdma_ch *ch, struct srpt_recv_ioctx *recv_ioctx, struct srpt_send_ioctx *send_ioctx)

處理 SRP_CMD 資訊單元

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

struct srpt_recv_ioctx *recv_ioctx

接收 I/O 上下文。

struct srpt_send_ioctx *send_ioctx

傳送I/O上下文。

void srpt_handle_tsk_mgmt(struct srpt_rdma_ch *ch, struct srpt_recv_ioctx *recv_ioctx, struct srpt_send_ioctx *send_ioctx)

處理 SRP_TSK_MGMT 資訊單元

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

struct srpt_recv_ioctx *recv_ioctx

接收 I/O 上下文。

struct srpt_send_ioctx *send_ioctx

傳送I/O上下文。

描述

當且僅當該請求將由目標核心處理時,才返回 0。

有關 SRP_TSK_MGMT 資訊單元的更多資訊,另請參見 SRP r16a 文件中的第 6.7 節。

bool srpt_handle_new_iu(struct srpt_rdma_ch *ch, struct srpt_recv_ioctx *recv_ioctx)

處理新接收的資訊單元

引數

struct srpt_rdma_ch *ch

接收資訊單元的 RDMA 通道。

struct srpt_recv_ioctx *recv_ioctx

與資訊單元關聯的接收 I/O 上下文。

void srpt_send_done(struct ib_cq *cq, struct ib_wc *wc)

傳送完成回撥

引數

struct ib_cq *cq

完成佇列。

struct ib_wc *wc

工作完成。

注意

儘管在測試中尚未觀察到這一點,但至少在理論上,由 srpt_handle_new_iu() 呼叫的 srpt_get_send_ioctx() 呼叫可能會失敗。 這是可能的,因為每個響應中的 req_lim_delta 值都設定為 1,並且此響應可能會導致啟動器在該響應的傳送完成處理完成之前傳送新請求。 例如,如果對 srpt_put_send_iotcx() 的呼叫由於更高優先順序的中斷而延遲,或者如果 IB 重傳導致傳送完成的生成延遲,則可能發生這種情況。 srpt_get_send_ioctx() 失敗的傳入資訊單元將在 cmd_wait_list 上排隊。 以下程式碼一次處理一個這些延遲的請求。

int srpt_create_ch_ib(struct srpt_rdma_ch *ch)

建立接收和傳送完成佇列

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

bool srpt_close_ch(struct srpt_rdma_ch *ch)

關閉 RDMA 通道

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

描述

確保與通道關聯的所有資源將在適當的時間取消分配。

當且僅當通道狀態已修改為 CH_DRAINING 時,才返回 true。

int srpt_cm_req_recv(struct srpt_device *const sdev, struct ib_cm_id *ib_cm_id, struct rdma_cm_id *rdma_cm_id, u8 port_num, __be16 pkey, const struct srp_login_req *req, const char *src_addr)

處理事件 IB_CM_REQ_RECEIVED

引數

struct srpt_device *const sdev

接收登入請求的 HCA。

struct ib_cm_id *ib_cm_id

IB/CM 連線識別符號(在 IB/CM 的情況下)。

struct rdma_cm_id *rdma_cm_id

RDMA/CM 連線識別符號(在 RDMA/CM 的情況下)。

u8 port_num

接收 REQ 訊息的埠。

__be16 pkey

傳入連線的 P_Key。

const struct srp_login_req *req

SRP 登入請求。

const char *src_addr

提交登入請求的埠的 GID (IB/CM) 或 IP 地址 (RDMA/CM)。

描述

如果此函式返回零,則 cm_id 的所有權將轉移到目標會話。 否則,呼叫方將保留 cm_id 的所有者。

void srpt_cm_rtu_recv(struct srpt_rdma_ch *ch)

處理 IB_CM_RTU_RECEIVED 或 USER_ESTABLISHED 事件

引數

struct srpt_rdma_ch *ch

SRPT RDMA 通道。

描述

RTU(準備使用)訊息指示已建立連線,並且收件人可以開始傳輸。

int srpt_cm_handler(struct ib_cm_id *cm_id, const struct ib_cm_event *event)

IB 連線管理器回撥函式

引數

struct ib_cm_id *cm_id

IB/CM 連線識別符號。

const struct ib_cm_event *event

IB/CM 事件。

描述

非零返回值將導致呼叫方銷燬 CM ID。

注意

僅當透過 srpt_cm_req_recv() 將 cm_id 的所有權轉移到通道時,srpt_cm_handler() 必須僅返回非零值失敗。 在任何其他情況下返回非零值將觸發與 srpt_release_channel() 中 ib_destroy_cm_id() 呼叫的競爭。

void srpt_queue_response(struct se_cmd *cmd)

傳輸對SCSI命令的響應

引數

struct se_cmd *cmd

SCSI目標命令。

描述

TCM核心呼叫的回撥函式。由於它可以在IB完成處理程式的上下文中呼叫,因此不能阻塞。

int srpt_release_sport(struct srpt_port *sport)

停用登入並等待關聯的通道

引數

struct srpt_port *sport

SRPT HCA埠。

struct port_and_port_id srpt_lookup_port(const char *name)

按名稱查詢RDMA埠

引數

const char *name

ASCII埠名稱

描述

如果返回RDMA埠指標,則遞增RDMA埠引用計數。呼叫者必須透過呼叫srpt_port_put_ref()來減少該引用計數。

int srpt_add_one(struct ib_device *device)

InfiniBand裝置添加回調函式

引數

struct ib_device *device

描述一個HCA。

void srpt_remove_one(struct ib_device *device, void *client_data)

InfiniBand裝置移除回撥函式

引數

struct ib_device *device

描述一個HCA。

void *client_data

作為第三個引數傳遞給ib_set_client_data()的值。

void srpt_close_session(struct se_session *se_sess)

強制關閉一個會話

引數

struct se_session *se_sess

SCSI目標會話。

描述

當用戶呼叫rmdir /sys/kernel/config/target/$driver/$port/$tpg/acls/$i_port_id時,TCM核心呼叫的回撥函式,用於清理與節點ACL關聯的會話。

int srpt_parse_i_port_id(u8 i_port_id[16], const char *name)

解析發起程式埠ID

引數

u8 i_port_id[16]

二進位制128位埠ID。

const char *name

128位發起程式埠ID的ASCII表示形式。

struct se_portal_group *srpt_make_tpg(struct se_wwn *wwn, const char *name)

為mkdir /sys/kernel/config/target/$driver/$port/$tpg呼叫的configfs回撥

引數

struct se_wwn *wwn

對應於$driver/$port。

const char *name

$tpg。

void srpt_drop_tpg(struct se_portal_group *tpg)

為rmdir /sys/kernel/config/target/$driver/$port/$tpg呼叫的configfs回撥

引數

struct se_portal_group *tpg

要登出的目標門戶組。

struct se_wwn *srpt_make_tport(struct target_fabric_configfs *tf, struct config_group *group, const char *name)

為mkdir /sys/kernel/config/target/$driver/$port呼叫的configfs回撥

引數

struct target_fabric_configfs *tf

未使用。

struct config_group *group

未使用。

const char *name

$port。

void srpt_drop_tport(struct se_wwn *wwn)

為rmdir /sys/kernel/config/target/$driver/$port呼叫的configfs回撥

引數

struct se_wwn *wwn

$port。

int srpt_init_module(void)

核心模組初始化

引數

void

無引數

注意

由於ib_register_client()註冊了回撥函式,並且由於至少一個這些回撥函式(srpt_add_one())呼叫了目標核心函式,因此必須在呼叫ib_register_client()之前,將此驅動程式註冊到目標核心。

RDMA的iSCSI擴充套件 (iSER) 目標支援

void isert_conn_terminate(struct isert_conn *isert_conn)

啟動連線終止

引數

struct isert_conn *isert_conn

isert連線結構體

註釋

如果連線狀態為BOUND,則將狀態移動到TERMINATING並啟動拆卸序列(rdma_disconnect)。如果連線狀態為UP,也要完成重新整理。

描述

這個例程必須在持有互斥鎖的情況下呼叫。因此,多次呼叫是安全的。

void isert_put_unsol_pending_cmds(struct iscsit_conn *conn)

丟棄等待非請求資料輸出的命令

引數

struct iscsit_conn *conn

iscsi 連線

描述

我們可能仍然有命令在等待非請求的資料輸出訊息。在target_wait_for_session_cmds上阻塞之前,我們必須對這些命令進行額外的引用。