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

Commit ae5a2e29 authored by Matan Barak's avatar Matan Barak Committed by David S. Miller
Browse files

net/mlx4_core: Add resource alloc/dealloc debugging



In order to aid debugging of functions that take a resource but
don't put it, add the last function name that successfully grabbed
this resource.

Signed-off-by: default avatarMatan Barak <matanb@mellanox.com>
Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 38353364
Loading
Loading
Loading
Loading
+45 −4
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ struct res_common {
	int			from_state;
	int			to_state;
	int			removing;
	const char		*func_name;
};

enum {
@@ -837,6 +838,36 @@ static int mpt_mask(struct mlx4_dev *dev)
	return dev->caps.num_mpts - 1;
}

static const char *mlx4_resource_type_to_str(enum mlx4_resource t)
{
	switch (t) {
	case RES_QP:
		return "QP";
	case RES_CQ:
		return "CQ";
	case RES_SRQ:
		return "SRQ";
	case RES_XRCD:
		return "XRCD";
	case RES_MPT:
		return "MPT";
	case RES_MTT:
		return "MTT";
	case RES_MAC:
		return "MAC";
	case RES_VLAN:
		return "VLAN";
	case RES_COUNTER:
		return "COUNTER";
	case RES_FS_RULE:
		return "FS_RULE";
	case RES_EQ:
		return "EQ";
	default:
		return "INVALID RESOURCE";
	}
}

static void *find_res(struct mlx4_dev *dev, u64 res_id,
		      enum mlx4_resource type)
{
@@ -846,9 +877,9 @@ static void *find_res(struct mlx4_dev *dev, u64 res_id,
				  res_id);
}

static int get_res(struct mlx4_dev *dev, int slave, u64 res_id,
static int _get_res(struct mlx4_dev *dev, int slave, u64 res_id,
		    enum mlx4_resource type,
		   void *res)
		    void *res, const char *func_name)
{
	struct res_common *r;
	int err = 0;
@@ -861,6 +892,10 @@ static int get_res(struct mlx4_dev *dev, int slave, u64 res_id,
	}

	if (r->state == RES_ANY_BUSY) {
		mlx4_warn(dev,
			  "%s(%d) trying to get resource %llx of type %s, but it's already taken by %s\n",
			  func_name, slave, res_id, mlx4_resource_type_to_str(type),
			  r->func_name);
		err = -EBUSY;
		goto exit;
	}
@@ -872,6 +907,7 @@ static int get_res(struct mlx4_dev *dev, int slave, u64 res_id,

	r->from_state = r->state;
	r->state = RES_ANY_BUSY;
	r->func_name = func_name;

	if (res)
		*((struct res_common **)res) = r;
@@ -881,6 +917,9 @@ static int get_res(struct mlx4_dev *dev, int slave, u64 res_id,
	return err;
}

#define get_res(dev, slave, res_id, type, res) \
	_get_res((dev), (slave), (res_id), (type), (res), __func__)

int mlx4_get_slave_from_resource_id(struct mlx4_dev *dev,
				    enum mlx4_resource type,
				    u64 res_id, int *slave)
@@ -911,8 +950,10 @@ static void put_res(struct mlx4_dev *dev, int slave, u64 res_id,

	spin_lock_irq(mlx4_tlock(dev));
	r = find_res(dev, res_id, type);
	if (r)
	if (r) {
		r->state = r->from_state;
		r->func_name = "";
	}
	spin_unlock_irq(mlx4_tlock(dev));
}