๐Ÿ˜†Verbs

ๆฆ‚่ฟฐ

Verbs็›ด่ฏ‘่ฟ‡ๆฅๆ˜ฏโ€œๅŠจ่ฏโ€็š„ๆ„ๆ€๏ผŒๅฎƒๅœจRDMA้ข†ๅŸŸไธญๆœ‰ไธค็งๅซไน‰๏ผš

1) ็”ฑIB่ง„่Œƒๆ‰€ๆ่ฟฐ็š„ไธ€็ป„ๆŠฝ่ฑกๅฎšไน‰๏ผŒ่ง„ๅฎšไบ†ๅ„ๅŽ‚ๅ•†็š„่ฝฏ็กฌไปถๅœจๅ„็งVerbsไธ‹ๅบ”่ฏฅๆ‰ง่กŒ็š„ๅŠจไฝœๆˆ–่€…่กจ็Žฐๅ‡บ็š„่กŒไธบ๏ผŒIB่ง„่Œƒๅนถๆœช่ง„ๅฎšๅฆ‚ไฝ•็ผ–็จ‹ๅฎž็Žฐ่ฟ™ไบ›Verbs๏ผŒๅœจ่ฟ™็งๅซไน‰ไธ‹๏ผŒVerbsๆ˜ฏไธŽๆ“ไฝœ็ณป็ปŸๆ— ๅ…ณ็š„ใ€‚

ไธพไธชไพ‹ๅญ๏ผŒIB่ง„่Œƒ่ฆๆฑ‚ๆ‰€ๆœ‰RDMA่ฎพๅค‡ๅฟ…้กปๆ”ฏๆŒCreate QP็š„่กŒไธบ๏ผˆIB ่ง„่Œƒ11.2.5.1๏ผ‰๏ผš

ๆ่ฟฐ๏ผš โ€‹ ไธบๆŒ‡ๅฎš็š„่ฎพๅค‡ๅˆ›ๅปบไธ€ไธชQPใ€‚ โ€‹ ็”จๆˆทๅฟ…้กปๆŒ‡ๅฎšไธ€็ป„็”จไบŽๅˆๅง‹ๅŒ–QP็š„ๅฑžๆ€งใ€‚ โ€‹ ๅฆ‚ๆžœๅˆ›ๅปบQPๆ‰€้œ€็š„ๅฑžๆ€งๆœ‰้žๆณ•ๅ€ผๆˆ–่€…็ผบๅคฑ๏ผŒ้‚ฃไนˆๅบ”่ฏฅ่ฟ”ๅ›ž้”™่ฏฏ๏ผŒ่ฏฅQPไธไผš่ขซๅˆ›ๅปบ๏ผ›ๅฆ‚ๆžœๆˆๅŠŸ๏ผŒ ้‚ฃไนˆ่ฟ”ๅ›ž่ฏฅQP็š„ๆŒ‡้’ˆๅ’ŒQPNใ€‚ โ€‹ โ€ฆโ€ฆ ่พ“ๅ…ฅ๏ผš โ€‹ ่ฎพๅค‡ๆŒ‡้’ˆ๏ผ› โ€‹ SQๅ…ณ่”ๅˆฐ็š„CQ๏ผ› โ€‹ RQๅ…ณ่”ๅˆฐ็š„CQ๏ผŒๅฆ‚ๆžœๆ˜ฏXRC็š„INI QP๏ผŒๅˆ™ๅฏไปฅไธๆบๅธฆๆญคๅ‚ๆ•ฐ๏ผ› โ€‹ โ€ฆโ€ฆ ่พ“ๅ‡บ๏ผš โ€‹ ๆ–ฐๅˆ›ๅปบ็š„QP็š„ๆŒ‡้’ˆ๏ผ› โ€‹ QP Number; โ€‹ SQ็š„ๆœ€ๅคงWRๅฎน้‡ใ€‚ โ€‹ โ€ฆโ€ฆ

ๅฏไปฅ็œ‹ๅ‡บIB่ง„่Œƒไธญ็š„Verbs๏ผŒๅฐฑๅƒๆ•™็ง‘ไนฆไธญๅฏนไธ€ไธชๆฆ‚ๅฟต่ฟ›่กŒๅฎšไน‰๏ผŒ่ฎฒ็š„ๆ˜ฏโ€œ้œ€่ฆๆ”ฏๆŒไป€ไนˆ๏ผŒไฝ†ๅ…ทไฝ“ๆ€Žไนˆๅฎž็Žฐๆˆ‘ไธๅš่ง„ๅฎšโ€ใ€‚

2) ็”ฑOpenFabricsๆŽจๅŠจๅฎž็Žฐ็š„ไธ€็ป„RDMAๅบ”็”จ็ผ–็จ‹ๆŽฅๅฃ๏ผˆAPI๏ผ‰ใ€‚ๆ—ข็„ถๆ˜ฏAPI๏ผŒ้‚ฃไนˆๅฟ…็„ถๅ’Œ่ฟ่กŒ็š„ๆ“ไฝœ็ณป็ปŸ็›ธๅ…ณใ€‚Verbs APIๆœ‰Linux็‰ˆๆœฌไปฅๅŠWindows็‰ˆๆœฌ๏ผˆWindows็‰ˆๅพˆไน…ๆฒกๆœ‰ๆ›ดๆ–ฐไบ†๏ผ‰ใ€‚

ๆˆ‘ไปฌ่ฟ˜ๆ˜ฏไปฅCreate QPไธบไพ‹๏ผŒไธ‹ๆ–‡ๅผ•็”จ่‡ชLinux็”จๆˆทๆ€Verbs API็š„ๅธฎๅŠฉๆ–‡ๆกฃ๏ผˆibv_create_qp(3): create/destroy queue pair๏ผ‰๏ผš

ๅ็งฐ๏ผš โ€‹ ibv_create_qp - create a queue pair (QP) ๆฆ‚่ฆ๏ผš

#include <infiniband/verbs.h>
struct ibv_qp ibv_create_qp(struct ibv_pd pd, struct ibv_qp_init_attr *qp_init_attr); 

ๆ่ฟฐ๏ผš โ€‹ ibv_create_qp()้€š่ฟ‡ไธ€ไธชๅ…ณ่”็š„PDๅˆ›ๅปบไธ€ไธชQP๏ผŒๅ‚ๆ•ฐqp_init_attrๆ˜ฏไธ€ไธชibv_qp_init_attr็ฑปๅž‹็š„็ป“ๆž„ไฝ“๏ผŒๅ…ถๅฎšไน‰ๅœจ<infiniband/verbs.h>ไธญใ€‚

struct ibv_qp_init_attr {
struct ibv_cq       *send_cq;        /* CQ to be associated with the Send Queue (SQ) */
struct ibv_cq       *recv_cq;        /* CQ to be associated with the Receive Queue (RQ) */
struct ibv_srq      *srq;            /* SRQ handle if QP is to be associated with an SRQ, otherwise NULL */
struct ibv_qp_cap    cap;            /* QP capabilities */
enum ibv_qp_type     qp_type;        /* QP Transport Service Type: IBV_QPT_RC, IBV_QPT_UC, or IBV_QPT_UD */
...
};

โ€‹ ๅ‡ฝๆ•ฐibv_create_qp()ไผšๆ›ดๆ–ฐqp_init_attr->cap struct็š„ๅ†…ๅฎน๏ผŒ่ฟ”ๅ›žๅˆ›ๅปบ็š„QPๆ‰€็œŸๆญฃๆ”ฏๆŒ็š„่ง„ๆ ผโ€ฆโ€ฆ ่ฟ”ๅ›žๅ€ผ๏ผš โ€‹ ibv_create_qp()่ฟ”ๅ›ž่ขซๅˆ›ๅปบ็š„QP็š„ๆŒ‡้’ˆ๏ผŒๆˆ–่€…ๅœจๅคฑ่ดฅๆ—ถ่ฟ”ๅ›žNULLใ€‚QPNๅฐ†ๅœจ่ฟ”ๅ›ž็š„ๆŒ‡้’ˆๆ‰€ๆŒ‡ๅ‘็š„็ป“ๆž„ไฝ“ไธญใ€‚

ๅฏ่งVerbs APIๅณๆ˜ฏๅฏนIB่ง„่Œƒไธญ็š„Verbsๅฎšไน‰็š„ๅ…ทไฝ“่ฝฏไปถๅฎž็Žฐใ€‚

Verbs็š„็ฌฌไธ€็ง่ฏญไน‰็›ดๆŽฅๆŸฅ้˜…IB่ง„่Œƒ็š„็ฌฌ11็ซ ๅณๅฏ๏ผŒ้‡Œ้ขๅšไบ†้žๅธธ่ฏฆ็ป†็š„ๆ่ฟฐใ€‚

ๆœฌๆ–‡ไป‹็ป็š„ๆ˜ฏ็ฌฌไบŒ็ง่ฏญไน‰๏ผŒๅŒ…ๅซVerbs APIๆ˜ฏไป€ไนˆ๏ผŒๅฆ‚ไฝ•ๅ’Œ็กฌไปถไบง็”Ÿไบคไบ’๏ผŒๆˆ‘ไปฌๅฆ‚ไฝ•้€š่ฟ‡Verbs APIๆฅ็ผ–ๅ†™RDMA็จ‹ๅบใ€‚ๅฆ‚ๆ— ็‰นๆฎŠ่ฏดๆ˜Ž๏ผŒไธ‹ๆ–‡ไธญ็š„Verbsๅ‡็‰นๆŒ‡Verbs APIใ€‚

็›ธๅ…ณๅ่ฏ่งฃ้‡Š

rdma-core

ๆŒ‡ๅผ€ๆบRDMA็”จๆˆทๆ€่ฝฏไปถๅ่ฎฎๆ ˆ๏ผŒๅŒ…ๅซ็”จๆˆทๆ€ๆก†ๆžถใ€ๅ„ๅŽ‚ๅ•†็”จๆˆทๆ€้ฉฑๅŠจใ€APIๅธฎๅŠฉๆ‰‹ๅ†ŒไปฅๅŠๅผ€ๅ‘่‡ชๆต‹่ฏ•ๅทฅๅ…ท็ญ‰ใ€‚

rdma-coreๅœจgithubไธŠ็ปดๆŠค๏ผŒๆˆ‘ไปฌ็š„็”จๆˆทๆ€Verbs APIๅฎž้™…ไธŠๅฐฑๆ˜ฏๅฎƒๅฎž็Žฐ็š„ใ€‚

kernel RDMA subsystem

ๆŒ‡ๅผ€ๆบ็š„Linuxๅ†…ๆ ธไธญ็š„RDMAๅญ็ณป็ปŸ๏ผŒๅŒ…ๅซRDMAๅ†…ๆ ธๆก†ๆžถๅŠๅ„ๅŽ‚ๅ•†็š„้ฉฑๅŠจใ€‚

RDMAๅญ็ณป็ปŸ่ทŸ้šLinux็ปดๆŠค๏ผŒๆ˜ฏๅ†…ๆ ธ็š„็š„ไธ€้ƒจๅˆ†ใ€‚ไธ€ๆ–น้ขๆไพ›ๅ†…ๆ ธๆ€็š„Verbs API๏ผŒไธ€ๆ–น้ข่ดŸ่ดฃๅฏนๆŽฅ็”จๆˆทๆ€็š„ๆŽฅๅฃใ€‚

OFED

ๅ…จ็งฐไธบOpenFabrics Enterprise Distribution๏ผŒๆ˜ฏไธ€ไธชๅผ€ๆบ่ฝฏไปถๅŒ…้›†ๅˆ๏ผŒๅ…ถไธญๅŒ…ๅซๅ†…ๆ ธๆก†ๆžถๅ’Œ้ฉฑๅŠจใ€็”จๆˆทๆก†ๆžถๅ’Œ้ฉฑๅŠจใ€ไปฅๅŠๅ„็งไธญ้—ดไปถใ€ๆต‹่ฏ•ๅทฅๅ…ทๅ’ŒAPIๆ–‡ๆกฃใ€‚

ๅผ€ๆบOFED็”ฑOFA็ป„็ป‡่ดŸ่ดฃๅผ€ๅ‘ใ€ๅ‘ๅธƒๅ’Œ็ปดๆŠค๏ผŒๅฎƒไผšๅฎšๆœŸไปŽrdma-coreๅ’Œๅ†…ๆ ธ็š„RDMAๅญ็ณป็ปŸๅ–่ฝฏไปถ็‰ˆๆœฌ๏ผŒๅนถๅฏนๅ„ๅ•†็”จOSๅ‘่กŒ็‰ˆ่ฟ›่กŒ้€‚้…ใ€‚้™คไบ†ๅ่ฎฎๆ ˆๅ’Œ้ฉฑๅŠจๅค–๏ผŒ่ฟ˜ๅŒ…ๅซไบ†perftest็ญ‰ๆต‹่ฏ•ๅทฅๅ…ทใ€‚

ไธ‹ๅ›พไธบOFA็ป™ๅ‡บ็š„OFED็š„ๆฆ‚่งˆ๏ผš

้™คไบ†ๅผ€ๆบOFEDไน‹ๅค–๏ผŒๅ„ๅŽ‚ๅ•†ไนŸไผšๆไพ›ๅฎšๅˆถ็‰ˆๆœฌ็š„OFED่ฝฏไปถๅŒ…๏ผŒๆฏ”ๅฆ‚ๅŽไธบ็š„HW_OFEDๅ’ŒMellanox็š„MLNX_OFEDใ€‚่ฟ™ไบ›ๅฎšๅˆถ็‰ˆๆœฌๅŸบไบŽๅผ€ๆบOFEDๅผ€ๅ‘๏ผŒ็”ฑๅŽ‚ๅ•†่‡ชๅทฑๆต‹่ฏ•ๅ’Œ็ปดๆŠค๏ผŒไผšๅœจๅผ€ๆบ่ฝฏไปถๅŒ…ๅŸบ็ก€ไธŠๆไพ›็งๆœ‰็š„ๅขžๅผบ็‰นๆ€ง๏ผŒๅนถ้™„ไธŠ่‡ชๅทฑ็š„้…็ฝฎใ€ๆต‹่ฏ•ๅทฅๅ…ท็ญ‰ใ€‚

ไปฅไธŠไธ‰่€…ๆ˜ฏๅŒ…ๅซๅ…ณ็ณปใ€‚ๆ— ่ฎบๆ˜ฏ็”จๆˆทๆ€่ฟ˜ๆ˜ฏๅ†…ๆ ธๆ€๏ผŒๆ•ดไธชRDMA็คพๅŒบ้žๅธธๆดป่ทƒ๏ผŒๆก†ๆžถๅ‡ ไนŽๆฏๅคฉ้ƒฝๅœจๅ˜ๅŠจ๏ผŒ้ƒฝๆ˜ฏๅนณๅ‡ๆฏไธคไธชๆœˆไธ€ไธช็‰ˆๆœฌใ€‚่€ŒOFEDไผšๅฎšๆœŸไปŽไธคไธช็คพๅŒบไธญๅ–ๅพ—ไปฃ็ ๏ผŒ่ฟ›่กŒๅŠŸ่ƒฝๅ’Œๅ…ผๅฎนๆ€งๆต‹่ฏ•ๅŽๅ‘ๅธƒ็‰ˆๆœฌ๏ผŒๆ—ถ้—ด่ทจๅบฆ่พƒๅคง๏ผŒไปฅๅนดไธบๅ•ไฝ่ฎกใ€‚

Verbs APIๆ˜ฏไป€ไนˆ

Verbs APIๆ˜ฏไธ€็ป„็”จไบŽไฝฟ็”จRDMAๆœๅŠก็š„ๆœ€ๅŸบๆœฌ็š„่ฝฏไปถๆŽฅๅฃ๏ผŒไนŸๅฐฑๆ˜ฏ่ฏดไธš็•Œ็š„RDMAๅบ”็”จ๏ผŒ่ฆไนˆ็›ดๆŽฅๅŸบไบŽ่ฟ™็ป„API็ผ–ๅ†™๏ผŒ่ฆไนˆๅŸบไบŽๅœจVerbs APIไธŠๅˆๅฐ่ฃ…ไบ†ไธ€ๅฑ‚ๆŽฅๅฃ็š„ๅ„็งไธญ้—ดไปถ็ผ–ๅ†™ใ€‚

Verbs APIๅ‘็”จๆˆทๆไพ›ไบ†ๆœ‰ๅ…ณRDMA็š„ไธ€ๅˆ‡ๅŠŸ่ƒฝ๏ผŒๅ…ธๅž‹็š„ๅŒ…ๆ‹ฌ๏ผšๆณจๅ†ŒMRใ€ๅˆ›ๅปบQPใ€Post Sendใ€Poll CQ็ญ‰็ญ‰ใ€‚

ๅฏนไบŽLinux็ณป็ปŸๆฅ่ฏด๏ผŒVerbs็š„ๅŠŸ่ƒฝ็”ฑrdma-coreๅ’Œๅ†…ๆ ธไธญ็š„RDMAๅญ็ณป็ปŸๆไพ›๏ผŒๅˆ†ไธบ็”จๆˆทๆ€VerbsๆŽฅๅฃๅ’Œๅ†…ๆ ธๆ€VerbsๆŽฅๅฃ๏ผŒๅˆ†ๅˆซ็”จไบŽ็”จๆˆทๆ€ๅ’Œๅ†…ๆ ธๆ€็š„RDMAๅบ”็”จใ€‚

็ป“ๅˆไธŠไธ€้ƒจๅˆ†็š„ๅ†…ๅฎน๏ผŒๆˆ‘ไปฌ็ป™ๅ‡บไธ€ไธชOFED็š„ๅ…จๆ™ฏ๏ผš

ๅนฟไน‰็š„Verbs APIไธป่ฆ็”ฑไธคๅคง้ƒจๅˆ†็ป„ๆˆ๏ผš

IB_VERBS

ๆŽฅๅฃไปฅibv_xx๏ผˆ็”จๆˆทๆ€๏ผ‰ๆˆ–่€…ib_xx๏ผˆๅ†…ๆ ธๆ€๏ผ‰ไฝœไธบๅ‰็ผ€๏ผŒๆ˜ฏๆœ€ๅŸบ็ก€็š„็ผ–็จ‹ๆŽฅๅฃ๏ผŒไฝฟ็”จIB_VERBSๅฐฑ่ถณๅคŸ็ผ–ๅ†™RDMAๅบ”็”จไบ†ใ€‚

ๆฏ”ๅฆ‚๏ผš

  • ibv_create_qp() ็”จไบŽๅˆ›ๅปบQP

  • ibv_post_send() ็”จไบŽไธ‹ๅ‘Send WR

  • ibv_poll_cq() ็”จไบŽไปŽCQไธญ่ฝฎ่ฏขCQE

RDMA_CM

ไปฅrdma_ไธบๅ‰็ผ€๏ผŒไธป่ฆๅˆ†ไธบไธคไธชๅŠŸ่ƒฝ๏ผš

CMA๏ผˆConnection Management Abstraction๏ผ‰

ๅœจSocketๅ’ŒVerbs APIๅŸบ็ก€ไธŠๅฎž็Žฐ็š„๏ผŒ็”จไบŽCMๅปบ้“พๅนถไบคๆขไฟกๆฏ็š„ไธ€็ป„ๆŽฅๅฃใ€‚CMๅปบ้“พๆ˜ฏๅœจSocketๅŸบ็ก€ไธŠๅฐ่ฃ…ไธบQPๅฎž็Žฐ๏ผŒไปŽ็”จๆˆท็š„่ง’ๅบฆๆฅ็œ‹๏ผŒๆ˜ฏๅœจ้€š่ฟ‡QPไบคๆขไน‹ๅŽๆ•ฐๆฎไบคๆขๆ‰€้œ€่ฆ็š„QPN๏ผŒKey็ญ‰ไฟกๆฏใ€‚

ๆฏ”ๅฆ‚๏ผš

  • rdma_listen()็”จไบŽ็›‘ๅฌ้“พ่ทฏไธŠ็š„CMๅปบ้“พ่ฏทๆฑ‚ใ€‚

  • rdma_connect()็”จไบŽ็กฎ่ฎคCM่ฟžๆŽฅใ€‚

CM VERBS

RDMA_CMไนŸๅฏไปฅ็”จไบŽๆ•ฐๆฎไบคๆข๏ผŒ็›ธๅฝ“ไบŽๅœจverbs APIไธŠๅˆๅฐ่ฃ…ไบ†ไธ€ๅฅ—ๆ•ฐๆฎไบคๆขๆŽฅๅฃใ€‚

ๆฏ”ๅฆ‚๏ผš

  • rdma_post_read()ๅฏไปฅ็›ดๆŽฅไธ‹ๅ‘RDMA READๆ“ไฝœ็š„WR๏ผŒ่€Œไธๅƒibv_post_send()๏ผŒ้œ€่ฆๅœจๅ‚ๆ•ฐไธญๆŒ‡ๅฎšๆ“ไฝœ็ฑปๅž‹ไธบREADใ€‚

  • rdma_post_ud_send()ๅฏไปฅ็›ดๆŽฅไผ ๅ…ฅ่ฟœ็ซฏQPN๏ผŒๆŒ‡ๅ‘่ฟœ็ซฏ็š„AH๏ผŒๆœฌๅœฐ็ผ“ๅ†ฒๅŒบๆŒ‡้’ˆ็ญ‰ไฟกๆฏ่งฆๅ‘ไธ€ๆฌกUD SENDๆ“ไฝœใ€‚

ไธŠ่ฟฐๆŽฅๅฃ่™ฝ็„ถๆ–นไพฟ๏ผŒไฝ†ๆ˜ฏ้œ€่ฆ้…ๅˆCMA็ฎก็†็š„้“พ่ทฏไฝฟ็”จ๏ผŒไธ่ƒฝ้…ๅˆVerbs APIไฝฟ็”จใ€‚

Verbs API้™คไบ†IB_VERBSๅ’ŒRDMA_CMไน‹ๅค–๏ผŒ่ฟ˜ๆœ‰MAD๏ผˆManagement Datagram๏ผ‰ๆŽฅๅฃ็ญ‰ใ€‚

้œ€่ฆๆณจๆ„็š„ๆ˜ฏ๏ผŒ่ฝฏไปถๆ ˆไธญ็š„Verbs APIๅ…ทไฝ“ๅฎž็Žฐๅ’ŒIB่ง„่Œƒไธญ็š„ๆ่ฟฐๅนถไธๆ˜ฏๅฎŒๅ…จไธ€่‡ด็š„ใ€‚IB่ง„่Œƒ่ฟญไปฃ่พƒๆ…ข๏ผŒ่€Œ่ฝฏไปถๆ ˆๅ‡ ไนŽๆฏๅคฉ้ƒฝๆœ‰ๅ˜ๅŒ–๏ผŒๆ‰€ไปฅ็ผ–ๅ†™ๅบ”็”จๆˆ–่€…้ฉฑๅŠจ็จ‹ๅบๆ—ถ๏ผŒๅบ”ไปฅ่ฝฏไปถๆ ˆAPIๆ–‡ๆกฃไธญ็š„ๆ่ฟฐไธบๅ‡†ใ€‚

็‹ญไน‰็š„Verbs APIไธ“ๆŒ‡ไปฅibv_/ib_ไธบๅ‰็ผ€็š„็”จๆˆทๆ€VerbsๆŽฅๅฃ๏ผŒๅ› ไธบRDMA็š„ๅ…ธๅž‹ๅบ”็”จๆ˜ฏๅœจ็”จๆˆทๆ€๏ผŒไธ‹ๆ–‡ไธป่ฆไป‹็ป็”จๆˆทๆ€็š„Verbs APIใ€‚

่ฎพ่ฎกVerbs API็š„ๅŽŸๅ› 

ไผ ็ปŸไปฅๅคช็ฝ‘็š„็”จๆˆท๏ผŒๅŸบไบŽSocket APIๆฅ็ผ–ๅ†™ๅบ”็”จ็จ‹ๅบ๏ผ›่€ŒRDMA็š„็”จๆˆท๏ผŒๅŸบไบŽVerbs APIๆฅ็ผ–ๅ†™ๅบ”็”จ็จ‹ๅบใ€‚

Verbs APIๆ”ฏๆŒIB/iWARP/RoCEไธ‰ๅคงRDMAๅ่ฎฎ๏ผŒ้€š่ฟ‡็ปŸไธ€ๆŽฅๅฃ๏ผŒ่ฎฉๅŒไธ€ไปฝRDMA็จ‹ๅบ็จ‹ๅบๅฏไปฅๆ— ่ง†ๅบ•ๅฑ‚็š„็กฌไปถๅ’Œ้“พ่ทฏๅทฎๅผ‚่ฟ่กŒๅœจไธๅŒ็š„็Žฏๅขƒไธญใ€‚

Verbs APIๆ‰€ๅŒ…ๅซ็š„ๅ†…ๅฎน

็”จๆˆทๆ€Verbs APIไธป่ฆๅŒ…ๅซไธคไธชๅฑ‚้ข็š„ๅŠŸ่ƒฝ๏ผš

ไธบๆ–นไพฟ่ฎฒ่งฃ๏ผŒไธ‹้ขๅฏนๅ„ๆŽฅๅฃ็š„ๅฝขๅผๅšไบ†็ฎ€ๅŒ–๏ผŒๆ ผๅผไธบ"่ฟ”ๅ›žๅ€ผ1,่ฟ”ๅ›žๅ€ผ2 ๅ‡ฝๆ•ฐๅ(ๅ‚ๆ•ฐ1, ๅ‚ๆ•ฐ2)"

1๏ผ‰ๆŽงๅˆถ้ข๏ผš

  • ่ฎพๅค‡็ฎก็†๏ผš

    • device_listibv_get_device_list()

็”จๆˆท่Žทๅ–ๅฏ็”จ็š„RDMA่ฎพๅค‡ๅˆ—่กจ๏ผŒไผš่ฟ”ๅ›žไธ€็ป„ๅฏ็”จ่ฎพๅค‡็š„ๆŒ‡้’ˆใ€‚

    • device_contextibv_open_device(device)

ๆ‰“ๅผ€ไธ€ไธชๅฏ็”จ็š„RDMA่ฎพๅค‡๏ผŒ่ฟ”ๅ›žๅ…ถไธŠไธ‹ๆ–‡ๆŒ‡้’ˆ๏ผˆ่ฟ™ไธชๆŒ‡้’ˆไผšๅœจไปฅๅŽ็”จๆฅๅฏน่ฟ™ไธช่ฎพๅค‡่ฟ›่กŒๅ„็งๆ“ไฝœ๏ผ‰ใ€‚

    • device_attr, errno ibv_query_device(device_context*)

ๆŸฅ่ฏขไธ€ไธช่ฎพๅค‡็š„ๅฑžๆ€ง/่ƒฝๅŠ›๏ผŒๆฏ”ๅฆ‚ๅ…ถๆ”ฏๆŒ็š„ๆœ€ๅคงQP๏ผŒCQๆ•ฐ้‡็ญ‰ใ€‚่ฟ”ๅ›ž่ฎพๅค‡็š„ๅฑžๆ€ง็ป“ๆž„ไฝ“ๆŒ‡้’ˆ๏ผŒไปฅๅŠ้”™่ฏฏ็ ใ€‚

  • ่ต„ๆบ็š„ๅˆ›ๅปบ๏ผŒๆŸฅ่ฏข๏ผŒไฟฎๆ”นๅ’Œ้”€ๆฏ๏ผš

    • pdibv_alloc_pd(device_context)

็”ณ่ฏทPDใ€‚่ฏฅๅ‡ฝๆ•ฐไผš่ฟ”ๅ›žไธ€ไธชPD็š„ๆŒ‡้’ˆใ€‚

    • mribv_reg_mr(pd, addr, length, access_flag)

ๆณจๅ†ŒMRใ€‚็”จๆˆทไผ ๅ…ฅ่ฆๆณจๅ†Œ็š„ๅ†…ๅญ˜็š„่ตทๅง‹ๅœฐๅ€ๅ’Œ้•ฟๅบฆ๏ผŒไปฅๅŠ่ฟ™ไธชMRๅฐ†่ฆไปŽๅฑž็š„PDๅ’Œๅฎƒ็š„่ฎฟ้—ฎๆƒ้™๏ผˆๆœฌๅœฐ่ฏป/ๅ†™๏ผŒ่ฟœ็ซฏ่ฏป/ๅ†™็ญ‰๏ผ‰๏ผŒ่ฟ”ๅ›žไธ€ไธชMR็š„ๆŒ‡้’ˆ็ป™็”จๆˆทใ€‚

    • cq ibv_create_cq(device_context, cqe_depth, ...)

ๅˆ›ๅปบCQใ€‚็”จๆˆทไผ ๅ…ฅCQ็š„ๆœ€ๅฐๆทฑๅบฆ๏ผˆ้ฉฑๅŠจๅฎž้™…็”ณ่ฏท็š„ๅฏ่ƒฝๆฏ”่ฟ™ไธชๅ€ผๅคง๏ผ‰๏ผŒ็„ถๅŽ่ฏฅๅ‡ฝๆ•ฐ่ฟ”ๅ›žCQ็š„ๆŒ‡้’ˆใ€‚

    • qpibv_create_qp(pd, qp_init_attr)

ๅˆ›ๅปบQPใ€‚็”จๆˆทไผ ๅ…ฅPDๅ’Œไธ€็ป„ๅฑžๆ€ง๏ผˆๅŒ…ๆ‹ฌRQๅ’ŒSQ็ป‘ๅฎšๅˆฐ็š„CQใ€QP็ป‘ๅฎš็š„SRQใ€QP็š„่ƒฝๅŠ›ใ€QP็ฑปๅž‹็ญ‰๏ผ‰๏ผŒๅ‘็”จๆˆท่ฟ”ๅ›žQP็š„ๆŒ‡้’ˆใ€‚

    • errnoibv_modiy_qp(qp, attr, attr_mask)

ไฟฎๆ”นQPใ€‚็”จๆˆทไผ ๅ…ฅQP็š„ๆŒ‡้’ˆ๏ผŒไปฅๅŠ่กจ็คบ่ฆไฟฎๆ”น็š„ๅฑžๆ€ง็š„ๆŽฉ็ ๅ’Œ่ฆไฟฎๆ”นๅ€ผใ€‚ไฟฎๆ”น็š„ๅ†…ๅฎนๅฏไปฅๆ˜ฏQP็Šถๆ€ใ€ๅฏน็ซฏQPNใ€QP่ƒฝๅŠ›ใ€็ซฏๅฃๅทๅ’Œ้‡ไผ ๆฌกๆ•ฐ็ญ‰็ญ‰ใ€‚ๅฆ‚ๆžœๅคฑ่ดฅ๏ผŒ่ฏฅๅ‡ฝๆ•ฐไผš่ฟ”ๅ›ž้”™่ฏฏ็ ใ€‚ Modify QPๆœ€้‡่ฆ็š„ไฝœ็”จๆ˜ฏ่ฎฉQPๅœจไธๅŒ็š„็Šถๆ€้—ด่ฟ็งป๏ผŒๅฎŒๆˆRST-->INIT-->RTR-->RTS็š„็Šถๆ€ๆœบ่ฝฌ็งปๅŽๆ‰ๅ…ทๅค‡ไธ‹ๅ‘Send WR็š„่ƒฝๅŠ›ใ€‚ไนŸๅฏ็”จๆฅๅฐ†QPๅˆ‡ๆขๅˆฐERROR็Šถๆ€ใ€‚

    • errnoibv_destroy_qp(qp)

้”€ๆฏQPใ€‚ๅณ้”€ๆฏQP็›ธๅ…ณ็š„่ฝฏไปถ่ต„ๆบใ€‚ๅ…ถไป–็š„่ต„ๆบไนŸ้ƒฝๆœ‰็ฑปไผผ็š„้”€ๆฏๆŽฅๅฃใ€‚

  • ไธญๆ–ญๅค„็†๏ผš

    • event_info, errnoibv_get_async_event(device_context)

ไปŽไบ‹ไปถ้˜Ÿๅˆ—ไธญ่Žทๅ–ไธ€ไธชๅผ‚ๆญฅไบ‹ไปถ๏ผŒ่ฟ”ๅ›žๅผ‚ๆญฅไบ‹ไปถ็š„ไฟกๆฏ๏ผˆไบ‹ไปถๆฅๆบ๏ผŒไบ‹ไปถ็ฑปๅž‹็ญ‰๏ผ‰ไปฅๅŠ้”™่ฏฏ็ ใ€‚

  • ่ฟžๆŽฅ็ฎก็†

    • rdma_xxx()

็”จไบŽCMๅปบ้“พ๏ผŒไธๅœจๆœฌๆ–‡ๅฑ•ๅผ€่ฎฒใ€‚

    • ...

2๏ผ‰ๆ•ฐๆฎ้ข๏ผš

  • ไธ‹ๅ‘WR

    • bad_wr, errnoibv_post_send(qp, wr)

ๅ‘ไธ€ไธชQPไธ‹ๅ‘ไธ€ไธชSend WR๏ผŒๅ‚ๆ•ฐwrๆ˜ฏไธ€ไธช็ป“ๆž„ไฝ“๏ผŒๅŒ…ๅซไบ†WR็š„ๆ‰€ๆœ‰ไฟกๆฏใ€‚ๅŒ…ๆ‹ฌwr_idใ€sgeๆ•ฐ้‡ใ€ๆ“ไฝœ็ ๏ผˆSEND/WRITE/READ็ญ‰ไปฅๅŠๆ›ด็ป†ๅˆ†็š„็ฑปๅž‹๏ผ‰ใ€‚WR็š„็ป“ๆž„ไผšๆ นๆฎๆœๅŠก็ฑปๅž‹ๅ’Œๆ“ไฝœ็ฑปๅž‹ๆœ‰ๆ‰€ๅทฎๅผ‚๏ผŒๆฏ”ๅฆ‚RCๆœๅŠก็š„WRITEๅ’ŒREADๆ“ไฝœ็š„WRไผšๅŒ…ๅซ่ฟœ็ซฏๅ†…ๅญ˜ๅœฐๅ€ๅ’ŒR_Key๏ผŒUDๆœๅŠก็ฑปๅž‹ไผšๅŒ…ๅซAH๏ผŒ่ฟœ็ซฏQPNๅ’ŒQ_Key็ญ‰ใ€‚

WR็ป็”ฑ้ฉฑๅŠจ่ฟ›ไธ€ๆญฅๅค„็†ๅŽ๏ผŒไผš่ฝฌๅŒ–ๆˆWQEไธ‹ๅ‘็ป™็กฌไปถใ€‚

ๅ‡บ้”™ไน‹ๅŽ๏ผŒ่ฏฅๆŽฅๅฃไผš่ฟ”ๅ›žๅ‡บ้”™็š„WR็š„ๆŒ‡้’ˆไปฅๅŠ้”™่ฏฏ็ ใ€‚

    • bad_wr, errno ibv_post_recv(qp, wr)

ๅŒibv_post_send๏ผŒๅชไธ่ฟ‡ๆ˜ฏไธ“้—จ็”จๆฅไธ‹ๅ‘RECVๆ“ไฝœ็š„WR็š„ๆŽฅๅฃใ€‚

  • ่Žทๅ–WC

    • num, wc ibv_poll_cq(cq, max_num)

ไปŽๅฎŒๆˆ้˜Ÿๅˆ—CQไธญ่ฝฎ่ฏขCQE๏ผŒ็”จๆˆท้œ€่ฆๆๅ‰ๅ‡†ๅค‡ๅฅฝๅ†…ๅญ˜ๆฅๅญ˜ๆ”พWC๏ผŒๅนถไผ ๅ…ฅๅฏไปฅๆŽฅๆ”ถๅคšๅฐ‘ไธชWCใ€‚่ฏฅๆŽฅๅฃไผš่ฟ”ๅ›žไธ€็ป„WC็ป“ๆž„ไฝ“๏ผˆๅ…ถๅ†…ๅฎนๅŒ…ๆ‹ฌwr_id๏ผŒ็Šถๆ€๏ผŒๆ“ไฝœ็ ๏ผŒQPN็ญ‰ไฟกๆฏ๏ผ‰ไปฅๅŠWC็š„ๆ•ฐ้‡ใ€‚

ไฝฟ็”จVerbs API็ผ–ๅ†™RDMAๅบ”็”จ็จ‹ๅบ

ๆŸฅ็œ‹ๆŽฅๅฃๅฎšไน‰

ๅ†…ๆ ธๆ€

ๅ†…ๆ ธๆ€VerbsๆŽฅๅฃๆฒกๆœ‰ไธ“้—จ็š„APIๆ‰‹ๅ†Œ๏ผŒ็ผ–็จ‹ๆ—ถ้œ€่ฆๅ‚่€ƒๅคดๆ–‡ไปถไธญ็š„ๅ‡ฝๆ•ฐๆณจ้‡Šใ€‚ๅฃฐๆ˜Ž่ฟ™ไบ›ๆŽฅๅฃ็š„ๅคดๆ–‡ไปถไฝไบŽๅ†…ๆ ธๆบ็ ็›ฎๅฝ•ไธญ็š„๏ผš

.../include/rdma/ib_verbs.h

ๆฏ”ๅฆ‚ib_post_send()ๆŽฅๅฃ๏ผš

ๅ‡ฝๆ•ฐๆณจ้‡Šไธญๆœ‰ๆ˜Ž็กฎไป‹็ป่ฏฅๅ‡ฝๆ•ฐ็š„ไฝœ็”จ๏ผŒ่พ“ๅ…ฅใ€่พ“ๅ‡บๅ‚ๆ•ฐไปฅๅŠ่ฟ”ๅ›žๅ€ผใ€‚

็”จๆˆทๆ€

ๆœ‰ๅคš็งๆ–นๆณ•ๆŸฅ้˜…็”จๆˆทๆ€็š„Verbs API๏ผš

ๅœจ็บฟๆŸฅ้˜…ๆœ€ๆ–ฐman page

็”จๆˆทๆ€็š„Verbs APIๆ‰‹ๅ†Œ่ทŸไปฃ็ ๅœจไธ€ไธชไป“ๅบ“็ปดๆŠค๏ผŒๆ‰‹ๅ†Œๅœฐๅ€๏ผš

https://github.com/linux-rdma/rdma-core/tree/master/libibverbs/man

่ฟ™้‡Œๆ˜ฏๆŒ‰็…งLinux็š„man pageๆ ผๅผ็ผ–ๅ†™็š„ๆบๆ–‡ไปถ๏ผŒ็›ดๆŽฅ็œ‹ๆบๆ–‡ไปถๅฏ่ƒฝไธๅคช็›ด่ง‚ใ€‚ๆœ‰ๅพˆๅคšๅœจ็บฟ็š„man page็ฝ‘็ซ™ๅฏไปฅๆŸฅ้˜…่ฟ™ไบ›ๆŽฅๅฃ็š„่ฏดๆ˜Ž๏ผŒๆฏ”ๅฆ‚ๅฎ˜ๆ–น็š„่ฟžๆŽฅ๏ผš

https://man7.org/linux/man-pages/man3/ibv_post_send.3.html

ไนŸๆœ‰ไธ€ไบ›ๅ…ถไป–้žๅฎ˜ๆ–น็ฝ‘้กต๏ผŒๆ”ฏๆŒๅœจ็บฟๆœ็ดข๏ผš

https://linux.die.net/man/3/ibv_post_send

ๆŸฅ้˜…็ณป็ปŸman page

ๅฆ‚ๆžœไฝ ไฝฟ็”จ็š„ๅ•†็”จOSๅฎ‰่ฃ…ไบ†rdma-coreๆˆ–่€…libibverbsๅบ“๏ผŒ้‚ฃไนˆๅฏไปฅ็›ดๆŽฅ็”จmanๅ‘ฝไปคๆŸฅ่ฏขๆŽฅๅฃ๏ผš

man ibv_post_send

ๆŸฅ่ฏขMellanox็š„็ผ–็จ‹ๆ‰‹ๅ†Œ

ใ€ŠRDMA Aware Networks Programming User Manual Rev 1.7ใ€‹๏ผŒๆœ€ๆ–ฐ็‰ˆๆ˜ฏ2015ๅนดๆ›ดๆ–ฐ็š„ใ€‚่ฏฅๆ‰‹ๅ†Œๅ†™็š„ๆฏ”่พƒ่ฏฆๅฐฝ๏ผŒๅนถไธ”้™„ๆœ‰็คบไพ‹็จ‹ๅบ๏ผŒไฝ†ๆ˜ฏๅฏ่ƒฝไธŽๆœ€ๆ–ฐ็š„ๆŽฅๅฃๆœ‰ไธ€ไบ›ๅทฎๅผ‚ใ€‚

ๅŒ…ๅซๅคดๆ–‡ไปถ

ๆŒ‰้œ€ๅŒ…ๅซไปฅไธ‹ๅคดๆ–‡ไปถ๏ผš

#include <infiniband/verbs.h>   // IB_VERBS ๅŸบ็ก€ๅคดๆ–‡ไปถ
#include <rdma/rdma_cma.h>      // RDMA_CM CMA ๅคดๆ–‡ไปถ ็”จไบŽCMๅปบ้“พ
#include <rdma/rdma_verbs.h>    // RDMA_CM VERBS ๅคดๆ–‡ไปถ ็”จไบŽไฝฟ็”จๅŸบไบŽCM็š„VerbsๆŽฅๅฃ

็ผ–ๅ†™ๅบ”็”จ

ไธ‹้ข้™„ไธŠไธ€ไธช็ฎ€ๅ•็š„RDMA็จ‹ๅบ็š„ๅคง่‡ดๆŽฅๅฃ่ฐƒ็”จๆต็จ‹๏ผŒClient็ซฏ็š„็จ‹ๅบไผšๅ‘้€ไธ€ไธชSEND่ฏทๆฑ‚็ป™Server็ซฏ็š„็จ‹ๅบ๏ผŒๅ›พไธญ็š„ๆŽฅๅฃไธŠๆ–‡ไธญ้ƒฝๆœ‰็ฎ€ๅ•ไป‹็ปใ€‚

้œ€่ฆๆณจๆ„็š„ๆ˜ฏๅ›พไธญ็š„ๅปบ้“พ่ฟ‡็จ‹ๆ˜ฏไธบไบ†ไบคๆขๅฏน็ซฏ็š„GID๏ผŒQPN็ญ‰ไฟกๆฏ๏ผŒๅฏไปฅ้€š่ฟ‡ไผ ็ปŸ็š„SocketๆŽฅๅฃๅฎž็Žฐ๏ผŒไนŸๅฏไปฅ้€š่ฟ‡ๆœฌๆ–‡ไธญไป‹็ป็š„CMAๆŽฅๅฃๅฎž็Žฐใ€‚

ๅ›พไธญ็‰นๆ„ๅˆ—ๅ‡บไบ†ๅคšๆฌกmodify QP็š„ๆต็จ‹๏ผŒไธ€ๆ–น้ขๆ˜ฏๆŠŠๅปบ้“พไน‹ๅŽไบคไบ’ๅพ—ๅˆฐ็š„ไฟกๆฏๅญ˜ๅ…ฅQPCไธญ๏ผˆๅณQP้—ดๅปบ็ซ‹่ฟžๆŽฅ็š„่ฟ‡็จ‹๏ผ‰๏ผŒๅฆไธ€ๆ–น้ขๆ˜ฏไธบไบ†ไฝฟQPๅค„ไบŽๅ…ทๅค‡ๆ”ถ/ๅ‘่ƒฝๅŠ›็Šถๆ€ๆ‰่ƒฝ่ฟ›่กŒไธ‹ไธ€ๆญฅ็š„ๆ•ฐๆฎไบคไบ’ใ€‚ๅ…ทไฝ“็Šถๆ€ๆœบ็š„ๅ†…ๅฎน่ฏทๅ›ž้กพ9. RDMAไน‹Queue Pair

็ผ–่ฏ‘ & ๆ‰ง่กŒ

ไธๅœจๆœฌๆ–‡่ฎจ่ฎบ่Œƒๅ›ดๅ†…ใ€‚

ๅฎ˜ๆ–น็คบไพ‹็จ‹ๅบ

rdma-core็š„ๆบ็ ็›ฎๅฝ•ไธ‹๏ผŒไธบlibibverbsๅ’Œlibrdmacm้ƒฝๆไพ›ไบ†็ฎ€ๅ•็š„็คบไพ‹็จ‹ๅบ๏ผŒๅคงๅฎถ็ผ–็จ‹ๆ—ถๅฏไปฅๅ‚่€ƒใ€‚

libibverbs

ไฝไบŽrdma-core/libibverbs/examples/็›ฎๅฝ•ไธ‹๏ผŒ้ƒฝไฝฟ็”จๆœ€ๅŸบ็ก€็š„IB_VERBSๆŽฅๅฃๅฎž็Žฐ๏ผŒๆ‰€ไปฅๅปบ้“พๆ–นๅผ้ƒฝๆ˜ฏๅŸบไบŽSocket็š„ใ€‚

  • asyncwatch.c ๆŸฅ่ฏขๆŒ‡ๅฎšRDMA่ฎพๅค‡ๆ˜ฏๅฆๆœ‰ๅผ‚ๆญฅไบ‹ไปถไธŠๆŠฅ

  • device_list.c ๅˆ—ๅ‡บๆœฌ็ซฏRDMA่ฎพๅค‡ๅˆ—่กจ

  • devinfo.c ๆŸฅ่ฏขๅนถๆ‰“ๅฐๆœฌ็ซฏRDMA่ฎพๅค‡่ฏฆ็ป†ไฟกๆฏ๏ผŒๆฒกๆœ‰ๅŒ็ซฏๆ•ฐๆฎไบคไบ’

  • rc_pingpong.c ๅŸบไบŽRCๆœๅŠก็ฑปๅž‹ๅŒ็ซฏๆ•ฐๆฎๆ”ถๅ‘็คบไพ‹

  • srq_pingpong.c ๅŸบไบŽRCๆœๅŠก็ฑปๅž‹ๅŒ็ซฏๆ•ฐๆฎๆ”ถๅ‘็คบไพ‹๏ผŒไธŽไธŠไธ€ไธช็คบไพ‹็จ‹ๅบ็š„ๅทฎๅผ‚ๆ˜ฏไฝฟ็”จไบ†SRQ่€Œไธๆ˜ฏๆ™ฎ้€š็š„RQใ€‚

  • ud_pingpong.c ๅŸบไบŽUDๆœๅŠก็ฑปๅž‹ๅŒ็ซฏๆ•ฐๆฎๆ”ถๅ‘็คบไพ‹

  • ud_pingpong.c ๅŸบไบŽUCๆœๅŠก็ฑปๅž‹ๅŒ็ซฏๆ•ฐๆฎๆ”ถๅ‘็คบไพ‹

  • xsrq_pingpong.c ๅŸบไบŽXRCๆœๅŠก็ฑปๅž‹ๅŒ็ซฏๆ•ฐๆฎๆ”ถๅ‘็คบไพ‹

librdmacm

ไฝไบŽrdma-core/librdmacm/examples/็›ฎๅฝ•ไธ‹๏ผš

  • rdma_client/server.c ๅŸบ็ก€็คบไพ‹๏ผŒ้€š่ฟ‡CMๅปบ้“พๅนถไฝฟ็”จCM VERBS่ฟ›่กŒๆ•ฐๆฎๆ”ถๅ‘ใ€‚

่ฏฅ็›ฎๅฝ•ๅ‰ฉไธ‹็š„็จ‹ๅบๅฐฑๆฒกๆœ‰็ ”็ฉถไบ†ใ€‚

ๅ‚่€ƒๆ–‡็Œฎ

[1] RDMA Aware Networks Programming User Manual Rev 1.7

[2] part1-OFA_Training_Sept_2016

[3] https://en.wikipedia.org/wiki/O

Last updated