diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-13 09:03:52 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-12-13 09:03:52 -0800 |
commit | daf34710a9e8849e04867d206692dc42d6d22263 (patch) | |
tree | c15e27dc0921d5545aab24673130f27ed5c4b569 /drivers/edac/edac_mc.c | |
parent | 9346116d148595a28fe3521f81ac8e14d93239c3 (diff) | |
parent | 0de2788447b67891a31a156c0206fd159e4a8981 (diff) |
Merge tag 'edac_for_4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp
Pull EDAC updates from Borislav Petkov:
- add KNM support to sb_edac (Piotr Luc)
- add AMD Zen support to amd64_edac (Yazen Ghannam)
- misc small cleanups, improvements and fixes (Colin Ian King, Dave
Hansen, Pan Bian, Thor Thayer, Wei Yongjun, Yanjiang Jin, yours
truly)
* tag 'edac_for_4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp: (26 commits)
EDAC, amd64: Fix improper return value
EDAC, amd64: Improve amd64-specific printing macros
EDAC, amd64: Autoload amd64_edac_mod on Fam17h systems
EDAC, amd64: Define and register UMC error decode function
EDAC, amd64: Determine EDAC capabilities on Fam17h systems
EDAC, amd64: Determine EDAC MC capabilities on Fam17h
EDAC, amd64: Add Fam17h debug output
EDAC, amd64: Add Fam17h scrubber support
EDAC, mce_amd: Don't report poison bit on Fam15h, bank 4
EDAC, amd64: Read MC registers on AMD Fam17h
EDAC, amd64: Reserve correct PCI devices on AMD Fam17h
EDAC, amd64: Add AMD Fam17h family type and ops
EDAC, amd64: Extend ecc_enabled() to Fam17h
EDAC, amd64: Don't force-enable ECC checking on newer systems
EDAC, amd64: Add Deferred Error type
EDAC, amd64: Rename __log_bus_error() to be more specific
EDAC, amd64: Change target of pci_name from F2 to F3
EDAC, mce_amd: Rename nb_bus_decoder to dram_ecc_decoder
EDAC: Add LRDDR4 DRAM type
EDAC, mpc85xx: Implement remove method for the platform driver
...
Diffstat (limited to 'drivers/edac/edac_mc.c')
-rw-r--r-- | drivers/edac/edac_mc.c | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index c3ee3ad98a63..d2ea9c4f1824 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c @@ -482,15 +482,8 @@ void edac_mc_free(struct mem_ctl_info *mci) } EXPORT_SYMBOL_GPL(edac_mc_free); - -/** - * find_mci_by_dev - * - * scan list of controllers looking for the one that manages - * the 'dev' device - * @dev: pointer to a struct device related with the MCI - */ -struct mem_ctl_info *find_mci_by_dev(struct device *dev) +/* Caller must hold mem_ctls_mutex */ +static struct mem_ctl_info *__find_mci_by_dev(struct device *dev) { struct mem_ctl_info *mci; struct list_head *item; @@ -506,6 +499,24 @@ struct mem_ctl_info *find_mci_by_dev(struct device *dev) return NULL; } + +/** + * find_mci_by_dev + * + * scan list of controllers looking for the one that manages + * the 'dev' device + * @dev: pointer to a struct device related with the MCI + */ +struct mem_ctl_info *find_mci_by_dev(struct device *dev) +{ + struct mem_ctl_info *ret; + + mutex_lock(&mem_ctls_mutex); + ret = __find_mci_by_dev(dev); + mutex_unlock(&mem_ctls_mutex); + + return ret; +} EXPORT_SYMBOL_GPL(find_mci_by_dev); /* @@ -588,7 +599,7 @@ static int add_mc_to_global_list(struct mem_ctl_info *mci) insert_before = &mc_devices; - p = find_mci_by_dev(mci->pdev); + p = __find_mci_by_dev(mci->pdev); if (unlikely(p != NULL)) goto fail0; @@ -640,26 +651,28 @@ static int del_mc_from_global_list(struct mem_ctl_info *mci) * * If found, return a pointer to the structure. * Else return NULL. - * - * Caller must hold mem_ctls_mutex. */ struct mem_ctl_info *edac_mc_find(int idx) { + struct mem_ctl_info *mci = NULL; struct list_head *item; - struct mem_ctl_info *mci; + + mutex_lock(&mem_ctls_mutex); list_for_each(item, &mc_devices) { mci = list_entry(item, struct mem_ctl_info, link); if (mci->mc_idx >= idx) { - if (mci->mc_idx == idx) - return mci; - + if (mci->mc_idx == idx) { + goto unlock; + } break; } } - return NULL; +unlock: + mutex_unlock(&mem_ctls_mutex); + return mci; } EXPORT_SYMBOL(edac_mc_find); @@ -779,7 +792,7 @@ struct mem_ctl_info *edac_mc_del_mc(struct device *dev) mutex_lock(&mem_ctls_mutex); /* find the requested mci struct in the global list */ - mci = find_mci_by_dev(dev); + mci = __find_mci_by_dev(dev); if (mci == NULL) { mutex_unlock(&mem_ctls_mutex); return NULL; |