InfiniBand 和遠端 DMA (RDMA) 介面¶
簡介和概述¶
待定
InfiniBand 核心介面¶
-
struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq, u8 nl_client, gfp_t gfp)¶
分配和初始化 netlink 訊息請求
引數
__u32 nlmsg_seqnetlink 訊息的序列號
u8 nl_clientnetlink 客戶端的索引
gfp_t gfp指示如何分配請求的記憶體
描述
如果成功,則返回新分配的 netlink 請求物件,否則返回 NULL
引數
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_clientnetlink 客戶端的索引
u32 reg要比較的給定註冊型別
描述
呼叫 iwpm_register_pid() 註冊客戶端 如果客戶端註冊與 reg 匹配,則返回 true,否則返回 false
-
void iwpm_set_registration(u8 nl_client, u32 reg)¶
設定客戶端註冊
引數
u8 nl_clientnetlink 客戶端的索引
u32 reg要設定的註冊型別
-
u32 iwpm_get_registration(u8 nl_client)¶
獲取客戶端註冊
引數
u8 nl_clientnetlink 客戶端的索引
描述
返回客戶端註冊型別
-
int iwpm_send_mapinfo(u8 nl_client, int iwpm_pid)¶
將客戶端的本地和對映的 IPv4/IPv6 地址資訊傳送到使用者空間埠對映器
引數
u8 nl_clientnetlink 客戶端的索引
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_countnetlink 訊息屬性的數量
描述
如果任何 nla_count 屬性為 NULL,則返回錯誤
-
struct sk_buff *iwpm_create_nlmsg(u32 nl_op, struct nlmsghdr **nlh, int nl_client)¶
分配 skb 並形成 netlink 訊息
引數
u32 nl_opNetlink 訊息操作碼
struct nlmsghdr **nlh儲存 skb 中 netlink 訊息頭的地址
int nl_clientnetlink 客戶端的索引
描述
返回新分配的 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 *cbNetlink 回撥結構
int policy_max期望的最大屬性型別
const struct nla_policy *nlmsg_policy驗證策略
struct nlattr *nltb[]用於儲存 policy_max 解析元素的陣列
const char *msg_typenetlink 訊息型別
描述
成功時返回 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_clientnetlink 客戶端的索引
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 *devrdma 裝置
unsigned int nr_cqe所需的 cqe 條目數
int comp_vector_hint完成向量提示 (-1),驅動程式根據內部計數器分配一個完成向量
enum ib_poll_context poll_ctxcq 輪詢上下文
描述
查詢滿足 comp_vector_hint 和 nr_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_cntsg 中的條目數
u32 sg_offset到 sg 的當前位元組偏移量
u64 remote_addr要讀取/寫入的遠端地址(相對於 rkey)
u32 rkey要操作的遠端金鑰
enum dma_data_direction dirDMA_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_cntsg 中的條目數
struct scatterlist *prot_sg從中/向其 READ/WRITE 保護資訊的 scatterlist
u32 prot_sg_cntprot_sg 中的條目數
struct ib_sig_attrs *sig_attrs簽名解除安裝演算法
u64 remote_addr要讀取/寫入的遠端地址(相對於 rkey)
u32 rkey要操作的遠端金鑰
enum dma_data_direction dirDMA_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_cntsg 中的條目數
enum dma_data_direction dirDMA_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_cntsg 中的條目數
struct scatterlist *prot_sg用於 PI 的 READ/WRITE 的 scatterlist
u32 prot_sg_cntprot_sg 中的條目數
enum dma_data_direction dirDMA_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 *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_device。 size 是要分配的結構的大小,包括底層驅動程式使用的任何私有資料。 必須使用 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 *devIB 裝置
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)¶
登出事件處理程式
-
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 portnet_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 *ibdevIB 裝置
struct net_device *ndev網路裝置
u32 *portnet_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_mask 和 device_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_mask 和 port_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 *indexGID 所在的 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 *indexPKey 所在的 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 portRDMA 裝置上的埠號。
u16 pkey請求發出的 Pkey。
const union ib_gid *gidnet_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 *devIB 裝置
struct ib_pd *pd與 QP 關聯的保護域。
struct ib_qp_init_attr *attr建立 QP 所需的初始屬性列表。如果 QP 建立成功,則屬性將更新為已建立 QP 的實際能力。
struct ib_udata *udata使用者資料
struct ib_uqp_object *uobjuverbs 物件
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_nentsdata_sg 中的條目數
unsigned int *data_sg_offset到 data_sg 中的位元組偏移量
struct scatterlist *meta_sg用於元資料的 DMA 對映散列表
int meta_sg_nentsmeta_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 *sgDMA 對映散列表
int sg_nentssg 中的條目數
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 *sglDMA 對映散列表
int sg_nentssg 中的條目數
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_lendesc 中的條目數
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_lendesc 中的條目數
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 *clientSA 客戶端
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_presentGRH 標誌(如果非零,將包括 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 *headerUD 報頭結構
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 *umemumem 結構
unsigned long pgsz_bitmapHW 支援的頁面大小的點陣圖
unsigned long virtIOVA
描述
此輔助函式適用於支援多個頁面大小但只能在 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 accessib_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 *opsMMU 間隔操作,當前只有 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 *opsMMU 間隔操作,當前只有 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 *sgeSGE 狀態
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 *sssge 狀態指標
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 *ibdevib 裝置
struct rdma_ah_attr *ah_attrAH 的屬性
描述
如果驅動程式支援更詳細的 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
-
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 *rdirvt dev 結構
-
int rvt_init_port(struct rvt_dev_info *rdi, struct rvt_ibport *port, int port_index, u16 *pkey_table)¶
初始化驅動埠的內部資料
引數
struct rvt_dev_info *rdirvt_dev_info 結構體
struct rvt_ibport *portrvt 埠
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 *qpQP
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 *qpQP
-
void rvt_add_rnr_timer(struct rvt_qp *qp, u32 aeth)¶
在 QP 上新增/啟動 rnr 計時器
引數
struct rvt_qp *qpQP
u32 aethRNR 超時的 aeth,模擬環回的 aeth
-
void rvt_stop_rc_timers(struct rvt_qp *qp)¶
停止所有計時器
引數
struct rvt_qp *qpQP 停止任何掛起的計時器
-
void rvt_del_timers_sync(struct rvt_qp *qp)¶
等待任何超時例程退出
引數
struct rvt_qp *qpQP
-
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 *rdirvt devinfo
u64 vu64 值
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 *rdirvt devinfo
u64 v64 位值
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 *ssSGE 狀態
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 *ibpIB 埠結構
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_headeriser 標頭
iscsi_headeriscsi 標頭
type命令/控制/資料輸出
dma_addr標頭緩衝區 dma_address
tx_sgsg[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_headeriser 標頭
iscsi_headeriscsi 標頭
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_deviceRDMA 裝置
pd此裝置的保護域
event_handlerIB 事件處理例程
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;
};
成員
listfastreg 描述符列表
鎖保護 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_idrdma_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_completionconn_stop 完成
ib_completionRDMA 清理完成
up_completion連線建立完成(狀態為 ISER_CONN_UP)
conn_list在 ig 連線列表中的條目
login_desc登入描述符
rx_descsrx 緩衝區陣列(迴圈緩衝區)
num_rx_descsrx 描述符的數量
scsi_sg_tablesizescsi 主機 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];
};
成員
descTX 描述符
iser_conn連結到 iser 連線
status當前任務狀態
sc連結到 scsi 命令
command_sent指示是否傳送了命令
diriser 資料方向
rdma_reg任務 rdma 註冊描述
dataiser 資料緩衝區描述
protiser 保護緩衝區描述
-
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_listiser 裝置全域性列表
connlist_mutex保護 connlist
connlistiser 連線全域性列表
desc_cachetx dataout 的 kmem 快取
-
int iscsi_iser_pdu_alloc(struct iscsi_task *task, uint8_t opcode)¶
分配一個 iscsi-iser PDU
引數
struct iscsi_task *taskiscsi 任務
uint8_t opcodeiscsi 命令 opcode
描述
- 注意:此例程不會失敗,只需分配 iscsi 任務
hdr 和最大 hdr 大小。
-
int iser_initialize_task_headers(struct iscsi_task *task, struct iser_tx_desc *tx_desc)¶
初始化任務標頭
引數
struct iscsi_task *taskiscsi 任務
struct iser_tx_desc *tx_desciser tx 描述符
註釋
此例程可能與 scsi 錯誤處理 TMF 的 iser 關閉流程競爭。因此,對於 TMF,我們應該獲取狀態互斥鎖,以避免取消引用可能已終止的 IB 裝置。
-
int iscsi_iser_task_init(struct iscsi_task *task)¶
初始化 iscsi-iser 任務
引數
struct iscsi_task *taskiscsi 任務
描述
初始化 scsi 命令或管理命令的任務。
返回
- 成功時返回零,或者在失敗時返回 -ENOMEM
來初始化任務標頭(dma 對映錯誤)。
-
int iscsi_iser_mtask_xmit(struct iscsi_conn *conn, struct iscsi_task *task)¶
xmit 管理(立即)任務
引數
struct iscsi_conn *conniscsi 連線
struct iscsi_task *task任務管理任務
註釋
該函式可以返回 -EAGAIN,在這種情況下,呼叫者必須稍後再次呼叫它,或者恢復。 ‘0’ 返回程式碼表示成功的 xmit。
-
int iscsi_iser_task_xmit(struct iscsi_task *task)¶
xmit iscsi-iser 任務
引數
struct iscsi_task *taskiscsi 任務
返回
成功時返回零,或者失敗時升級 $error。
-
void iscsi_iser_cleanup_task(struct iscsi_task *task)¶
清理 iscsi-iser 任務
引數
struct iscsi_task *taskiscsi 任務
註釋
- 如果 RDMA 裝置已為 NULL(可能已在 DEVICE_REMOVAL CM 事件中刪除)
則它將退出而不執行 dma 取消對映。
-
u8 iscsi_iser_check_protection(struct iscsi_task *task, sector_t *sector)¶
檢查任務的保護資訊狀態。
引數
struct iscsi_task *taskiscsi 任務
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_sessioniscsi 類連線
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_sessioniscsi 類會話
struct iscsi_cls_conn *cls_conniscsi 類連線
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_conniscsi 類連線
註釋
- 這裡 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_conniscsi 類連線
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_sessioniscsi 類會話
描述
刪除並釋放 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 *episcsi 端點控制代碼
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 *shostscsi_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 *episcsi 端點(在 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 *episcsi 端點控制代碼
描述
此例程不會被 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 *taskSCSI 命令任務
-
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 *taskSCSI 命令任務
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 程式碼
引數
struct ib_conn *ib_conn連線 RDMA 資源
引數
struct iser_conn *iser_conniser 連線結構體
bool destroy指示是否需要嘗試釋放 iser 裝置和記憶體區域池(僅 iscsi 關閉和 DEVICE_REMOVAL 會使用此功能)。
描述
此例程在持有 iser 狀態互斥鎖的情況下呼叫,因此 cm_id 刪除已從此處移除。可以安全地多次呼叫。
引數
struct iser_conn *iser_conniSER 連線上下文
引數
struct iser_conn *iser_conniSER 連線上下文
描述
在持有狀態互斥鎖的情況下呼叫
-
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_desciSER 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 裝置的指標
opsopa vnic 控制操作
num_portsopa 埠的數量
-
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 的指標
ibdevib 裝置
cport指向 opa vnic 控制埠的指標
rn_opsrdma netdev 的 net_device_ops
port_numOPA 埠號
vport_numvesw 埠號
鎖介面卡鎖
info虛擬乙太網交換機埠資訊
vema_mac_addr由 vema 配置的 MAC 地址
umac_hash單播 MAC 列表雜湊
mmac_hash多播 MAC 列表雜湊
mactblMAC 條目的雜湊表
mactbl_lockMAC 表鎖
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雜湊列表控制代碼
indexMAC 表中條目的索引
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_id10 位結構 ID
vesw_id12 位虛擬乙太網交換機 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_entMAC 表條目的最大數量
max_smac_entMAC 表中的最大 smac 條目數
mac_tbl_digestMAC 表摘要
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;
};
成員
veswOPA vnic 交換機資訊
vportOPA 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_addrMAC 地址
mac_addr_maskMAC 地址位掩碼
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[];
};
成員
offsetMAC 表起始偏移量
num_entries要獲取或設定的條目數
mac_tbl_digestMAC 表摘要
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_instanceOPA 埠上的 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_instanceOPA 埠上的 vport 例項
vesw_id虛擬乙太網交換機 ID
veswport_num虛擬乙太網交換機埠號
tx_errors傳輸錯誤
rx_errors接收錯誤
rsvd0保留位元組
tx_smac_filtsmac 過濾器錯誤
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_id10 位結構 ID
veswid12 位虛擬乙太網交換機 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_addrMAC 地址
-
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_countgen_count,指示更改
entryMAC 列表條目
描述
與用於設定全域性管理地址的本地管理地址中相同的屬性 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唯一的組織識別符號
dataMAD 資料
-
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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 *adaptervnic 埠介面卡
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_numOPA 埠號
vportsvnic 埠
event_handlerib 事件處理程式
鎖介面卡介面鎖
-
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_tblmac 表
描述
此函式檢查所需偏移量和條目數的有效性。
返回
如果 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_numvnic 埠號(要新增)
描述
返回指向 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 *deviceIB 裝置指標
描述
分配 vnic 控制埠並對其進行初始化。
-
void opa_vnic_vema_rem_one(struct ib_device *device, void *client_data)¶
處理 ib 裝置移除
引數
struct ib_device *deviceIB 裝置指標
void *client_dataib 客戶端資料
描述
取消初始化並釋放 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_SENTSRP_CMD 的 SRP_RSP 已傳送。
SRPT_STATE_MGMT正在處理 SCSI 任務管理命令。
SRPT_STATE_MGMT_RSP_SENTSRP_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 地址。
offsetbuf 和 dma 中實際使用的第一個位元組的偏移量。
indexI/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_lenioctx.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_ctxsRDMA 讀取/寫入上下文。
imm_sg立即資料的散列表。
rdma_cqeRDMA 完成佇列元素。
stateI/O 上下文狀態。
cmd目標核心命令資料結構。
n_rdma傳輸此 ioctx 所需的工作請求數。
n_rw_ctxrw_ctxs 陣列的大小。
queue_status_only將 SCSI 狀態傳送回發起程式,但不傳送資料。
sense_data要傳送給發起程式的感應資料。
-
enum rdma_ch_state¶
SRP 通道狀態
常量
CH_CONNECTINGQP 處於 RTR 狀態;等待 RTU。
CH_LIVEQP 處於 RTS 狀態。
CH_DISCONNECTINGDREQ 已傳送並等待 DREP,或 DREQ 已接收。
CH_DRAININGDREP 已接收,或等待 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_sizecq 中的 CQE 數量。
zw_cqe零長度寫入 CQE。
rcuRCU 頭。
kref此通道的 kref。
closed只要可以建立具有相同身份的新通道物件,就會發出訊號的完成物件。
rq_sizeIB 接收佇列大小。
max_rsp_sizeRSP 響應訊息的最大大小(以位元組為單位)。
sq_wr_avail傳送佇列中可用的工作請求數。
sport指向此通道使用的 HCA 埠資訊的指標。
max_ti_iu_len目標到發起程式的最大資訊單元長度。
req_lim請求限制:發起程式在收到響應之前可以傳送的最大請求數。
req_lim_delta尚未傳送回發起程式的信用額度數。
imm_data_offsetSRP_CMD 的立即資料的偏移量。
spinlock保護 free_list 和 state。
state通道狀態。另請參閱
enum rdma_ch_state。rsp_buf_cacheioctx_ring 的 kmem_cache。
ioctx_ring傳送環。
req_buf_cacheioctx_recv_ring 的 kmem_cache。
ioctx_recv_ring接收 I/O 上下文環。
listsrpt_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 頭。
entrysrpt_port.nexus_list 列表節點。
ch_liststruct 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_sizeSRP 響應訊息的最大大小(以位元組為單位)。
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;
};
成員
entrysport_id->tpg_list 中的條目。
sport_id此 TPG 關聯的埠名稱。
tpgLIO 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_nameGUID 格式的埠名稱。
guid_idGUID 格式的埠名稱的 LIO 目標埠資訊。
gid_nameGID 格式的埠名稱。
gid_idGID 格式的埠名稱的 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 的反向指標。
pdIB 保護域。
lkey具有對所有本地記憶體的寫入許可權的 L_Key(本地金鑰)。
srq每個 HCA 的 SRQ(共享接收佇列)。
cm_id連線識別符號。
srq_sizeSRQ 大小。
sdev_mutex序列化 use_srq 更改。
use_srq是否使用 SRQ。
req_buf_cacheioctx_ring 緩衝區的 kmem_cache。
ioctx_ring每個 HCA 的 SRQ。
event_handler每個 HCA 的非同步 IB 事件處理程式。
listsrpt_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 *ptrSRPT 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 slotI/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_agentib_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_agentib_register_mad_agent()的返回值。
struct ib_mad_send_buf *send_buf未使用。
struct ib_mad_recv_wc *mad_wc報告已收到MAD的工作完成。
引數
struct srpt_port *sportSRPT HCA埠。
描述
啟用InfiniBand管理資料報處理,更新快取的sm_lid、lid和gid值,併為指定埠上的MAD處理註冊回撥函式。
注意
對於同一埠,多次呼叫此函式是安全的。
-
void srpt_unregister_mad_agent(struct srpt_device *sdev, int port_cnt)¶
登出MAD回撥函式
引數
struct srpt_device *sdevSRPT 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 *sdevSRPT HCA指標。
int ioctx_sizeI/O上下文大小。
struct kmem_cache *buf_cacheI/O緩衝區快取。
enum dma_data_direction dirDMA資料方向。
-
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 *sdevSRPT HCA指標。
struct srpt_ioctx *ioctxI/O上下文指標。
struct kmem_cache *buf_cacheI/O緩衝區快取。
enum dma_data_direction dirDMA資料方向。
-
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_sizeI/O上下文環中的元素數量。
int ioctx_sizeI/O上下文大小。
struct kmem_cache *buf_cacheI/O緩衝區快取。
int alignment_offsetSRP資訊單元開始的每個環形緩衝區中的偏移量。
enum dma_data_direction dirDMA資料方向。
-
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 *sdevSRPT HCA指標。
int ring_size環形元素數量。
struct kmem_cache *buf_cacheI/O緩衝區快取。
enum dma_data_direction dirDMA資料方向。
-
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 *sdevSRPT HCA指標。
struct srpt_rdma_ch *chSRPT RDMA 通道。
struct srpt_recv_ioctx *ioctx接收I/O上下文指標。
-
int srpt_zerolength_write(struct srpt_rdma_ch *ch)¶
執行零長度RDMA寫入
引數
struct srpt_rdma_ch *chSRPT 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 *chSRPT 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 *chSRPT RDMA 通道。
-
struct srpt_send_ioctx *srpt_get_send_ioctx(struct srpt_rdma_ch *ch)¶
獲取用於傳送到啟動器的 I/O 上下文
引數
struct srpt_rdma_ch *chSRPT 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 statusSRP_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 *chSRPT 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 *chSRPT 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 *chSRPT RDMA 通道。
-
bool srpt_close_ch(struct srpt_rdma_ch *ch)¶
關閉 RDMA 通道
引數
struct srpt_rdma_ch *chSRPT 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_idIB/CM 連線識別符號(在 IB/CM 的情況下)。
struct rdma_cm_id *rdma_cm_idRDMA/CM 連線識別符號(在 RDMA/CM 的情況下)。
u8 port_num接收 REQ 訊息的埠。
__be16 pkey傳入連線的 P_Key。
const struct srp_login_req *reqSRP 登入請求。
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 *chSRPT RDMA 通道。
描述
RTU(準備使用)訊息指示已建立連線,並且收件人可以開始傳輸。
-
int srpt_cm_handler(struct ib_cm_id *cm_id, const struct ib_cm_event *event)¶
IB 連線管理器回撥函式
引數
struct ib_cm_id *cm_idIB/CM 連線識別符號。
const struct ib_cm_event *eventIB/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 *cmdSCSI目標命令。
描述
TCM核心呼叫的回撥函式。由於它可以在IB完成處理程式的上下文中呼叫,因此不能阻塞。
引數
struct srpt_port *sportSRPT HCA埠。
-
struct port_and_port_id srpt_lookup_port(const char *name)¶
按名稱查詢RDMA埠
引數
const char *nameASCII埠名稱
描述
如果返回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_sessSCSI目標會話。
描述
當用戶呼叫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 *name128位發起程式埠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_connisert連線結構體
註釋
如果連線狀態為BOUND,則將狀態移動到TERMINATING並啟動拆卸序列(rdma_disconnect)。如果連線狀態為UP,也要完成重新整理。
描述
這個例程必須在持有互斥鎖的情況下呼叫。因此,多次呼叫是安全的。
-
void isert_put_unsol_pending_cmds(struct iscsit_conn *conn)¶
丟棄等待非請求資料輸出的命令
引數
struct iscsit_conn *conniscsi 連線
描述
我們可能仍然有命令在等待非請求的資料輸出訊息。在target_wait_for_session_cmds上阻塞之前,我們必須對這些命令進行額外的引用。