【文化差异】深入扒一扒rdma报文中的syndrome到底是什么意思?(错误的行为( ERROR BEHAVIOR)或者叫做故障行为(fault behavior))


英语是一个显式表征的语言。
rdma中经常见到syndrome单词。

1.词典释义

1.1 牛津

syn·drome 名词. /ˈsɪndrəʊm/

  1. a set of physical conditions that show you have a particular disease or medical problem综合征;综合症状
    This syndrome is associated with frequent coughing.这种综合征与经常咳嗽有关。
  1. a set of opinions or a way of behaving that is typical of a particular type of person, attitude or social problem典型意见;典型表现
    With teenagers, be prepared for the ‘Me, me, me!’ syndrome (= they think of themselves first) .跟青少年在一起,对他们那种凡事只想到“我、我、我!”的典型心理不要大惊小怪。

要点:

  • 是set of xxx,一系列的xxx
  • 是选项或者行为方式,在rdma中主要是指rdma的一些典型的行为方式。所以叫rdma的syndrome

1.2 韦氏词典

在这里插入图片描述
要点:

  • set of 并存的事物

1.3 21世纪大英汉词典

1.同时发生(或存在)的一组事物(如举动、情绪等);(行为、情绪、看法等的)一组表现(或特征)
2.行为型,标明行为的特征
3.【病理学】综合征状,征群,综合征

1.4 词根词缀分析

syndrome (n.) - “a number of symptoms occurring together”,16世纪40年代,源自医学拉丁语,源自希腊语syndrome “concurrence of symptoms, concourse of people”,源自syndromos “place where several roads meet”,字面含义 “a running together”,源自syn- “with” (参看:syn-) + dromos “a running, course” (参看:dromedary)。心理学含义始于1955。

syndrome : syn-,一起,-drom,跑,词源同dromedary,hippodrome.引申比喻义综合症状,症候群等。

例子:
Down syndrome唐氏综合症
Crush syndrome压伤综合症
irritable bowel syndrome[医]肠道易激综合症

2. rdma中的syndrome

2.1 某段驱动代码

static int mlx5_cmd_check(struct mlx5_core_dev *dev, void *in, void *out)
{
	mlx5_cmd_mbox_status(out, &status, &syndrome);
	if (!status)
		return 0;
	
	mlx5_core_dbg(dev,
		      "%s(0x%x) op_mod(0x%x) failed, status %s(0x%x), syndrome (0x%x)\n",
	...
	return cmd_status_to_err(status);
}

获取命令的outbox 检查结果,伴随命令状态,然后返回syndrome值。只有异常场景需要关注syndrome。

2.2 某段代码2

/* check the completion status (here we don't care about the completion opcode */
if (wc.status != IBV_WC_SUCCESS)
{
	fprintf(stderr, "got bad completion with status: 0x%x, vendor syndrome: 0x%x\n", wc.status, wc.vendor_err);
	rc = 1;
}

可见vendor定义固定的syndrome就是vendor的err
参考:https://docs.nvidia.com/networking/display/rdmaawareprogrammingv17/programming+examples+using+ibv+verbs

2.3 在AETH头部中的syndrome

AETH的报文头,将会出现在ACK、NAK的rdma报文中。Syndrome域段的内容:比如如果是NAK的时候表示NAK的code
在这里插入图片描述

2.3.1 ACK包中的syndrome

在rdma包的 BEM包结构(参考:more) 中,ACK包就包含了ACK返回的状态,ACK状态就包含了syndrome,表示对端的一些情况症状,是ACK的返回的一系列状况的说明。
在这里插入图片描述

2.3.2 NAK包中的syndrome

在这里插入图片描述

2.3.3 RDMA协议中请求方错误行为

下表列出了请求方检测到的所有错误,包括本地和远程检测到的错误。如果错误是由请求方本地检测到的,标记为“symdrome”的列将包含“本地检测到的错误”的标记。如果错误是由响应方远程检测到的,这一列将列出响应方返回的NAK symdrome。故障行为类别指定了请求方采取的向其客户端报告错误的行动。

2.3.3.1 请求方的错误行为( ERROR BEHAVIOR)

在这里插入图片描述
在这里插入图片描述

2.3.3.2 6 种请求方故障行为

在这里插入图片描述

2.3.4 RDMA协议中请求方错误行为

2.3.4.1 发送方的错误行为( ERROR BEHAVIOR)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.4.2 12类响应端的故障行为

在这里插入图片描述

2.4 mlx驱动如何获取syndrome

可以看到mlx中消息box只有在out中才有syndrome,并且是获取mbox的状态的时候获取的syndrome

struct mlx5_ifc_mbox_out_bits {
	u8         status[0x8];
	u8         reserved_at_8[0x18];

	u8         syndrome[0x20];

	u8         reserved_at_40[0x40];
};

struct mlx5_ifc_mbox_in_bits {
	u8         opcode[0x10];
	u8         uid[0x10];

	u8         reserved_at_20[0x10];
	u8         op_mod[0x10];

	u8         reserved_at_40[0x40];
};

void mlx5_cmd_mbox_status(void *out, u8 *status, u32 *syndrome)
{
	*status = MLX5_GET(mbox_out, out, status); 
	*syndrome = MLX5_GET(mbox_out, out, syndrome); //这个宏定义会读取结构mlx5_ifc_mbox_out_bits的syndrome
}

在mlx驱动中会在某条发送给Firmware的命令敲dbell后,收到fw的响应。在响应处理流程里面会调用mlx5_cmd_comp_handler进行处理,进一步调用 mlx5_cmd_check -> mlx5_cmd_mbox_status获取来自于fw的syndrome。如果有异常,就会把异常的syndrome得到,这些syndrome都是rdma协议中规定的。具体在代码实现中会有对应关系,不过由于该部分代码在fw中,linux ofed代码无法直接看到。
不过对于status的一些异常可以在ofed中查看到:

static int cmd_status_to_err(u8 status)
{
	switch (status) {
	case MLX5_CMD_STAT_OK:				return 0;
	case MLX5_CMD_STAT_INT_ERR:			return -EIO;
	case MLX5_CMD_STAT_BAD_OP_ERR:			return -EINVAL;
	case MLX5_CMD_STAT_BAD_PARAM_ERR:		return -EINVAL;
	case MLX5_CMD_STAT_BAD_SYS_STATE_ERR:		return -EIO;
	case MLX5_CMD_STAT_BAD_RES_ERR:			return -EINVAL;
	case MLX5_CMD_STAT_RES_BUSY:			return -EBUSY;
	case MLX5_CMD_STAT_LIM_ERR:			return -ENOMEM;
	case MLX5_CMD_STAT_BAD_RES_STATE_ERR:		return -EINVAL;
	case MLX5_CMD_STAT_IX_ERR:			return -EINVAL;
	case MLX5_CMD_STAT_NO_RES_ERR:			return -EAGAIN;
	case MLX5_CMD_STAT_BAD_INP_LEN_ERR:		return -EIO;
	case MLX5_CMD_STAT_BAD_OUTP_LEN_ERR:		return -EIO;
	case MLX5_CMD_STAT_BAD_QP_STATE_ERR:		return -EINVAL;
	case MLX5_CMD_STAT_BAD_PKT_ERR:			return -EINVAL;
	case MLX5_CMD_STAT_BAD_SIZE_OUTS_CQES_ERR:	return -EINVAL;
	default:					return -EIO;
	}
}

enum {
	MLX5_CMD_STAT_OK			= 0x0,
	MLX5_CMD_STAT_INT_ERR			= 0x1,
	MLX5_CMD_STAT_BAD_OP_ERR		= 0x2,
	MLX5_CMD_STAT_BAD_PARAM_ERR		= 0x3,
	MLX5_CMD_STAT_BAD_SYS_STATE_ERR		= 0x4,
	MLX5_CMD_STAT_BAD_RES_ERR		= 0x5,
	MLX5_CMD_STAT_RES_BUSY			= 0x6,
	MLX5_CMD_STAT_LIM_ERR			= 0x8,
	MLX5_CMD_STAT_BAD_RES_STATE_ERR		= 0x9,
	MLX5_CMD_STAT_IX_ERR			= 0xa,
	MLX5_CMD_STAT_NO_RES_ERR		= 0xf,
	MLX5_CMD_STAT_BAD_INP_LEN_ERR		= 0x50,
	MLX5_CMD_STAT_BAD_OUTP_LEN_ERR		= 0x51,
	MLX5_CMD_STAT_BAD_QP_STATE_ERR		= 0x10,
	MLX5_CMD_STAT_BAD_PKT_ERR		= 0x30,
	MLX5_CMD_STAT_BAD_SIZE_OUTS_CQES_ERR	= 0x40,
};

从这里也能窥探到fw中对于命令执行后,命令的状态是有限的十几个,而对应的syndrome会有非常多。并且status还会转化成linux标准错误EINVAL。这也从侧方面反映了为什么在驱动中除了cmd的status还需要syndrome,因为status最后反映到linux的errno后,会失真异常信息,所以需要syndrome来表征协议层面的详细错误或者故障,也就是所谓的ERROR BEHAVIOR和fault behavior。

3. 综述

综合来看在rdma中syndrome主要表示一些错误的行为( ERROR BEHAVIOR)或者叫做故障行为(fault behavior)。而正是这些behavior组合成了syndrome。如果再具象化一点syndrome是什么就是前面那几个behavior列表里面的behavior的集合。于是乎就会有syndrome id类似这种东西了(虽然实际不是这么表达的,但有助于理解rdma的syndrome是什么,尤其是看到驱动中的错误打印或者报文中的syndrome,但驱动的syndrome其本质有一部分也就是报文中的syndrome)。
最后一问是,那到底这些syndrome是隶属于谁?可能隶属于rdma协议最准确,次之隶属于Firmware吧。再次之隶属于OFED驱动。不过rdma协议实现的主体还是在Firmware中,为了方便理解就不太对但比较方便的隶属于本端和对端的FW吧
最后一句话表达syndrome到底是什么?现在看下来就清晰直观了。就是FW的各种BEHAVIOR的集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值