EDAC, skx_common: Refactor so that we initialize "dev" in result of adxl decode.
authorTony Luck <tony.luck@intel.com>
Thu, 15 Aug 2019 21:18:59 +0000 (14:18 -0700)
committerTony Luck <tony.luck@intel.com>
Fri, 18 Oct 2019 22:27:48 +0000 (15:27 -0700)
Simplifies the code a little.

Acked-by: Aristeu Rozanski <aris@redhat.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
drivers/edac/skx_common.c

index 83dd5da67a287bfc2e2e69f6af23ebf7142f4a5e..de06d58d7d2a339141631560b042777669f65986 100644 (file)
@@ -100,6 +100,7 @@ void __exit skx_adxl_put(void)
 
 static bool skx_adxl_decode(struct decoded_addr *res)
 {
+       struct skx_dev *d;
        int i, len = 0;
 
        if (res->addr >= skx_tohm || (res->addr >= skx_tolm &&
@@ -118,6 +119,24 @@ static bool skx_adxl_decode(struct decoded_addr *res)
        res->channel = (int)adxl_values[component_indices[INDEX_CHANNEL]];
        res->dimm    = (int)adxl_values[component_indices[INDEX_DIMM]];
 
+       if (res->imc > NUM_IMC - 1) {
+               skx_printk(KERN_ERR, "Bad imc %d\n", res->imc);
+               return false;
+       }
+
+       list_for_each_entry(d, &dev_edac_list, list) {
+               if (d->imc[0].src_id == res->socket) {
+                       res->dev = d;
+                       break;
+               }
+       }
+
+       if (!res->dev) {
+               skx_printk(KERN_ERR, "No device for src_id %d imc %d\n",
+                          res->socket, res->imc);
+               return false;
+       }
+
        for (i = 0; i < adxl_component_count; i++) {
                if (adxl_values[i] == ~0x0ull)
                        continue;
@@ -452,24 +471,6 @@ static void skx_unregister_mci(struct skx_imc *imc)
        edac_mc_free(mci);
 }
 
-static struct mem_ctl_info *get_mci(int src_id, int lmc)
-{
-       struct skx_dev *d;
-
-       if (lmc > NUM_IMC - 1) {
-               skx_printk(KERN_ERR, "Bad lmc %d\n", lmc);
-               return NULL;
-       }
-
-       list_for_each_entry(d, &dev_edac_list, list) {
-               if (d->imc[0].src_id == src_id)
-                       return d->imc[lmc].mci;
-       }
-
-       skx_printk(KERN_ERR, "No mci for src_id %d lmc %d\n", src_id, lmc);
-       return NULL;
-}
-
 static void skx_mce_output_error(struct mem_ctl_info *mci,
                                 const struct mce *m,
                                 struct decoded_addr *res)
@@ -580,15 +581,12 @@ int skx_mce_check_error(struct notifier_block *nb, unsigned long val,
        if (adxl_component_count) {
                if (!skx_adxl_decode(&res))
                        return NOTIFY_DONE;
-
-               mci = get_mci(res.socket, res.imc);
-       } else {
-               if (!skx_decode || !skx_decode(&res))
-                       return NOTIFY_DONE;
-
-               mci = res.dev->imc[res.imc].mci;
+       } else if (!skx_decode || !skx_decode(&res)) {
+               return NOTIFY_DONE;
        }
 
+       mci = res.dev->imc[res.imc].mci;
+
        if (!mci)
                return NOTIFY_DONE;