Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1868b82 authored by Eli Cohen's avatar Eli Cohen Committed by Roland Dreier
Browse files

mlx5: Remove checksum on command interface commands



Checksum calculations consume CPU resources and can be significant to
the rate of resource creation/destruction.

Signed-off-by: default avatarEli Cohen <eli@mellanox.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 56e1ab0f
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -180,28 +180,32 @@ static int verify_block_sig(struct mlx5_cmd_prot_block *block)
	return 0;
}

static void calc_block_sig(struct mlx5_cmd_prot_block *block, u8 token)
static void calc_block_sig(struct mlx5_cmd_prot_block *block, u8 token,
			   int csum)
{
	block->token = token;
	block->ctrl_sig = ~xor8_buf(block->rsvd0, sizeof(*block) - sizeof(block->data) - 2);
	if (csum) {
		block->ctrl_sig = ~xor8_buf(block->rsvd0, sizeof(*block) -
					    sizeof(block->data) - 2);
		block->sig = ~xor8_buf(block, sizeof(*block) - 1);
	}
}

static void calc_chain_sig(struct mlx5_cmd_msg *msg, u8 token)
static void calc_chain_sig(struct mlx5_cmd_msg *msg, u8 token, int csum)
{
	struct mlx5_cmd_mailbox *next = msg->next;

	while (next) {
		calc_block_sig(next->buf, token);
		calc_block_sig(next->buf, token, csum);
		next = next->next;
	}
}

static void set_signature(struct mlx5_cmd_work_ent *ent)
static void set_signature(struct mlx5_cmd_work_ent *ent, int csum)
{
	ent->lay->sig = ~xor8_buf(ent->lay, sizeof(*ent->lay));
	calc_chain_sig(ent->in, ent->token);
	calc_chain_sig(ent->out, ent->token);
	calc_chain_sig(ent->in, ent->token, csum);
	calc_chain_sig(ent->out, ent->token, csum);
}

static void poll_timeout(struct mlx5_cmd_work_ent *ent)
@@ -539,8 +543,7 @@ static void cmd_work_handler(struct work_struct *work)
	lay->type = MLX5_PCI_CMD_XPORT;
	lay->token = ent->token;
	lay->status_own = CMD_OWNER_HW;
	if (!cmd->checksum_disabled)
		set_signature(ent);
	set_signature(ent, !cmd->checksum_disabled);
	dump_command(dev, ent, 1);
	ktime_get_ts(&ent->ts1);

@@ -773,8 +776,6 @@ static int mlx5_copy_from_msg(void *to, struct mlx5_cmd_msg *from, int size)

		copy = min_t(int, size, MLX5_CMD_DATA_BLOCK_SIZE);
		block = next->buf;
		if (xor8_buf(block, sizeof(*block)) != 0xff)
			return -EINVAL;

		memcpy(to, block->data, copy);
		to += copy;
@@ -1361,6 +1362,7 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
		goto err_map;
	}

	cmd->checksum_disabled = 1;
	cmd->max_reg_cmds = (1 << cmd->log_sz) - 1;
	cmd->bitmask = (1 << cmd->max_reg_cmds) - 1;

+5 −16
Original line number Diff line number Diff line
@@ -165,9 +165,7 @@ static int handle_hca_cap(struct mlx5_core_dev *dev)
	struct mlx5_cmd_set_hca_cap_mbox_in *set_ctx = NULL;
	struct mlx5_cmd_query_hca_cap_mbox_in query_ctx;
	struct mlx5_cmd_set_hca_cap_mbox_out set_out;
	struct mlx5_profile *prof = dev->profile;
	u64 flags;
	int csum = 1;
	int err;

	memset(&query_ctx, 0, sizeof(query_ctx));
@@ -197,20 +195,14 @@ static int handle_hca_cap(struct mlx5_core_dev *dev)
	memcpy(&set_ctx->hca_cap, &query_out->hca_cap,
	       sizeof(set_ctx->hca_cap));

	if (prof->mask & MLX5_PROF_MASK_CMDIF_CSUM) {
		csum = !!prof->cmdif_csum;
		flags = be64_to_cpu(set_ctx->hca_cap.flags);
		if (csum)
			flags |= MLX5_DEV_CAP_FLAG_CMDIF_CSUM;
		else
			flags &= ~MLX5_DEV_CAP_FLAG_CMDIF_CSUM;

		set_ctx->hca_cap.flags = cpu_to_be64(flags);
	}

	if (dev->profile->mask & MLX5_PROF_MASK_QP_SIZE)
		set_ctx->hca_cap.log_max_qp = dev->profile->log_max_qp;

	flags = be64_to_cpu(query_out->hca_cap.flags);
	/* disable checksum */
	flags &= ~MLX5_DEV_CAP_FLAG_CMDIF_CSUM;

	set_ctx->hca_cap.flags = cpu_to_be64(flags);
	memset(&set_out, 0, sizeof(set_out));
	set_ctx->hca_cap.log_uar_page_sz = cpu_to_be16(PAGE_SHIFT - 12);
	set_ctx->hdr.opcode = cpu_to_be16(MLX5_CMD_OP_SET_HCA_CAP);
@@ -225,9 +217,6 @@ static int handle_hca_cap(struct mlx5_core_dev *dev)
	if (err)
		goto query_ex;

	if (!csum)
		dev->cmd.checksum_disabled = 1;

query_ex:
	kfree(query_out);
	kfree(set_ctx);
+1 −1
Original line number Diff line number Diff line
@@ -181,7 +181,7 @@ enum {
	MLX5_DEV_CAP_FLAG_TLP_HINTS	= 1LL << 39,
	MLX5_DEV_CAP_FLAG_SIG_HAND_OVER	= 1LL << 40,
	MLX5_DEV_CAP_FLAG_DCT		= 1LL << 41,
	MLX5_DEV_CAP_FLAG_CMDIF_CSUM	= 1LL << 46,
	MLX5_DEV_CAP_FLAG_CMDIF_CSUM	= 3LL << 46,
};

enum {
+1 −3
Original line number Diff line number Diff line
@@ -747,8 +747,7 @@ static inline u32 mlx5_idx_to_mkey(u32 mkey_idx)

enum {
	MLX5_PROF_MASK_QP_SIZE		= (u64)1 << 0,
	MLX5_PROF_MASK_CMDIF_CSUM	= (u64)1 << 1,
	MLX5_PROF_MASK_MR_CACHE		= (u64)1 << 2,
	MLX5_PROF_MASK_MR_CACHE		= (u64)1 << 1,
};

enum {
@@ -758,7 +757,6 @@ enum {
struct mlx5_profile {
	u64	mask;
	u32	log_max_qp;
	int	cmdif_csum;
	struct {
		int	size;
		int	limit;