]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
net/mlx4_core: Add resource alloc/dealloc debugging
authorMatan Barak <matanb@mellanox.com>
Sun, 29 Jan 2017 16:56:15 +0000 (18:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Jan 2017 20:26:42 +0000 (15:26 -0500)
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>
drivers/net/ethernet/mellanox/mlx4/resource_tracker.c

index 84c74a79752a179c0576c9bb13e57e38d3ff746a..6fe9f76ae656b6b11056154eafcc34e83e844666 100644 (file)
@@ -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));
 }