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: Matan Barak <matanb@mellanox.com> Signed-off-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3835336401
commit
ae5a2e29d1
|
@ -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,
|
||||
enum mlx4_resource type,
|
||||
void *res)
|
||||
static int _get_res(struct mlx4_dev *dev, int slave, u64 res_id,
|
||||
enum mlx4_resource type,
|
||||
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 @@ exit:
|
|||
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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue