IB/hfi1: Correct unnecessary acquisition of HW mutex
authorGrzegorz Morys <grzegorz.morys@intel.com>
Mon, 9 Oct 2017 19:38:04 +0000 (12:38 -0700)
committerDoug Ledford <dledford@redhat.com>
Wed, 18 Oct 2017 14:12:59 +0000 (10:12 -0400)
Avoid acquiring already acquired hardware mutex and releasing
the unacquired one as these are redundant operations.
Add printouts for such situations to help detect potential errors
within the driver.

Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Grzegorz Morys <grzegorz.morys@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/firmware.c

index 001698b744ee08a1003b9eecad5c3d5880234110..cea0d4f3248fa8023f14395c9ee5a04b6d75d96c 100644 (file)
@@ -1387,7 +1387,14 @@ int acquire_hw_mutex(struct hfi1_devdata *dd)
        unsigned long timeout;
        int try = 0;
        u8 mask = 1 << dd->hfi1_id;
-       u8 user;
+       u8 user = (u8)read_csr(dd, ASIC_CFG_MUTEX);
+
+       if (user == mask) {
+               dd_dev_info(dd,
+                           "Hardware mutex already acquired, mutex mask %u\n",
+                           (u32)mask);
+               return 0;
+       }
 
 retry:
        timeout = msecs_to_jiffies(HM_TIMEOUT) + jiffies;
@@ -1418,7 +1425,15 @@ retry:
 
 void release_hw_mutex(struct hfi1_devdata *dd)
 {
-       write_csr(dd, ASIC_CFG_MUTEX, 0);
+       u8 mask = 1 << dd->hfi1_id;
+       u8 user = (u8)read_csr(dd, ASIC_CFG_MUTEX);
+
+       if (user != mask)
+               dd_dev_warn(dd,
+                           "Unable to release hardware mutex, mutex mask %u, my mask %u\n",
+                           (u32)user, (u32)mask);
+       else
+               write_csr(dd, ASIC_CFG_MUTEX, 0);
 }
 
 /* return the given resource bit(s) as a mask for the given HFI */