dpdk fbarray

yghr發表於2024-12-08

概述

fbarray是一個固定大小的多程序共享的記憶體塊陣列。

struct rte_fbarray {
	char name[RTE_FBARRAY_NAME_LEN]; /**< name associated with an array */
	unsigned int count;              /**< number of entries stored */
	unsigned int len;                /**< current length of the array */
	unsigned int elt_sz;             /**< size of each element */
	void *data;                      /**< data pointer */
	rte_rwlock_t rwlock;             /**< multiprocess lock */
};

fbarray中的data指標就是執行elt_sz * len大小的記憶體塊,最後連線一塊點陣圖,用於標記哪個元素已經使用了。
每一塊mmap的記憶體都儲存到全域性的連結串列中mem_area_tailq連結串列中。
fbarray的data

如何實現多程序共享?

rte_fbarray_init
首先primary程序先計算出所需fbarray的記憶體塊大小(對齊pagesize)mmap,此時mmap的屬性是MAP_PRIVATE | MAP_ANONYMOUS,表示primary程序可見。然後在/var/run/dpdk/fbarray_%s建立對應的檔案,並使用flock + LOCK_EX獨佔。獨佔成功後就轉為共享flock + LOCK_SH,然後再呼叫ftruncate修改檔案大小,並使用mmap + MAP_FIXED | MAP_SHARED轉為多程序可見。
rte_fbarray_attach
這樣其他程序呼叫mmap就可以實現共享。
多程序間使用fbarray->rwlock讀寫鎖實現寫互斥、讀共享。