Commit b90ebfc0 authored by Shay Drory's avatar Shay Drory Committed by Saeed Mahameed
Browse files

net/mlx5: Allocate command stats with xarray



Command stats is an array with more than 2K entries, which amounts to
~180KB. This is way more than actually needed, as only ~190 entries
are being used.

Therefore, replace the array with xarray.

Signed-off-by: default avatarShay Drory <shayd@nvidia.com>
Reviewed-by: default avatarMoshe Shemesh <moshe@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 06cd555f
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -1225,8 +1225,8 @@ static int mlx5_cmd_invoke(struct mlx5_core_dev *dev, struct mlx5_cmd_msg *in,
		goto out_free;

	ds = ent->ts2 - ent->ts1;
	if (ent->op < MLX5_CMD_OP_MAX) {
		stats = &cmd->stats[ent->op];
	stats = xa_load(&cmd->stats, ent->op);
	if (stats) {
		spin_lock_irq(&stats->lock);
		stats->sum += ds;
		++stats->n;
@@ -1695,8 +1695,8 @@ static void mlx5_cmd_comp_handler(struct mlx5_core_dev *dev, u64 vec, bool force

			if (ent->callback) {
				ds = ent->ts2 - ent->ts1;
				if (ent->op < MLX5_CMD_OP_MAX) {
					stats = &cmd->stats[ent->op];
				stats = xa_load(&cmd->stats, ent->op);
				if (stats) {
					spin_lock_irqsave(&stats->lock, flags);
					stats->sum += ds;
					++stats->n;
@@ -1923,7 +1923,9 @@ static void cmd_status_log(struct mlx5_core_dev *dev, u16 opcode, u8 status,
	if (!err || !(strcmp(namep, "unknown command opcode")))
		return;

	stats = &dev->cmd.stats[opcode];
	stats = xa_load(&dev->cmd.stats, opcode);
	if (!stats)
		return;
	spin_lock_irq(&stats->lock);
	stats->failed++;
	if (err < 0)
@@ -2189,7 +2191,6 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)
	struct mlx5_cmd *cmd = &dev->cmd;
	u32 cmd_l;
	int err;
	int i;

	cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
	if (!cmd->pool)
@@ -2209,8 +2210,6 @@ int mlx5_cmd_init(struct mlx5_core_dev *dev)

	spin_lock_init(&cmd->alloc_lock);
	spin_lock_init(&cmd->token_lock);
	for (i = 0; i < MLX5_CMD_OP_MAX; i++)
		spin_lock_init(&cmd->stats[i].lock);

	create_msg_cache(dev);

+29 −1
Original line number Diff line number Diff line
@@ -188,6 +188,24 @@ static const struct file_operations slots_fops = {
	.read	= slots_read,
};

static struct mlx5_cmd_stats *
mlx5_cmdif_alloc_stats(struct xarray *stats_xa, int opcode)
{
	struct mlx5_cmd_stats *stats = kzalloc(sizeof(*stats), GFP_KERNEL);
	int err;

	if (!stats)
		return NULL;

	err = xa_insert(stats_xa, opcode, stats, GFP_KERNEL);
	if (err) {
		kfree(stats);
		return NULL;
	}
	spin_lock_init(&stats->lock);
	return stats;
}

void mlx5_cmdif_debugfs_init(struct mlx5_core_dev *dev)
{
	struct mlx5_cmd_stats *stats;
@@ -200,10 +218,14 @@ void mlx5_cmdif_debugfs_init(struct mlx5_core_dev *dev)

	debugfs_create_file("slots_inuse", 0400, *cmd, &dev->cmd, &slots_fops);

	xa_init(&dev->cmd.stats);

	for (i = 0; i < MLX5_CMD_OP_MAX; i++) {
		stats = &dev->cmd.stats[i];
		namep = mlx5_command_str(i);
		if (strcmp(namep, "unknown command opcode")) {
			stats = mlx5_cmdif_alloc_stats(&dev->cmd.stats, i);
			if (!stats)
				continue;
			stats->root = debugfs_create_dir(namep, *cmd);

			debugfs_create_file("average", 0400, stats->root, stats,
@@ -224,7 +246,13 @@ void mlx5_cmdif_debugfs_init(struct mlx5_core_dev *dev)

void mlx5_cmdif_debugfs_cleanup(struct mlx5_core_dev *dev)
{
	struct mlx5_cmd_stats *stats;
	unsigned long i;

	debugfs_remove_recursive(dev->priv.dbg.cmdif_debugfs);
	xa_for_each(&dev->cmd.stats, i, stats)
		kfree(stats);
	xa_destroy(&dev->cmd.stats);
}

void mlx5_cq_debugfs_init(struct mlx5_core_dev *dev)
+1 −1
Original line number Diff line number Diff line
@@ -322,7 +322,7 @@ struct mlx5_cmd {
	struct mlx5_cmd_debug dbg;
	struct cmd_msg_cache cache[MLX5_NUM_COMMAND_CACHES];
	int checksum_disabled;
	struct mlx5_cmd_stats stats[MLX5_CMD_OP_MAX];
	struct xarray stats;
};

struct mlx5_cmd_mailbox {