Commit 2d7bbb91c8df26c60d223205a087507430024177
Committed by
Linus Torvalds
1 parent
37f04581ab
Exists in
master
and in
7 other branches
[PATCH] EDAC: mc numbers refactor 1-of-2
Remove add_mc_to_global_list(). In next patch, this function will be reimplemented with different semantics. 1 Reimplement add_mc_to_global_list() with semantics that allow the caller to determine the ID number for a mem_ctl_info structure. Then modify edac_mc_add_mc() so that the caller specifies the ID number for the new mem_ctl_info structure. Platform-specific code should be able to assign the ID numbers in a platform-specific manner. For instance, on Opteron it makes sense to have the ID of the mem_ctl_info structure match the ID of the node that the memory controller belongs to. 2 Modify callers of edac_mc_add_mc() so they use the new semantics. Signed-off-by: Doug Thompson <norsk5@xmission.com> Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 8 changed files with 55 additions and 36 deletions Side-by-side Diff
drivers/edac/amd76x_edac.c
... | ... | @@ -257,7 +257,10 @@ |
257 | 257 | |
258 | 258 | amd76x_get_error_info(mci, &discard); /* clear counters */ |
259 | 259 | |
260 | - if (edac_mc_add_mc(mci)) { | |
260 | + /* Here we assume that we will never see multiple instances of this | |
261 | + * type of memory controller. The ID is therefore hardcoded to 0. | |
262 | + */ | |
263 | + if (edac_mc_add_mc(mci,0)) { | |
261 | 264 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); |
262 | 265 | goto fail; |
263 | 266 | } |
drivers/edac/e752x_edac.c
... | ... | @@ -953,7 +953,10 @@ |
953 | 953 | "tolm = %x, remapbase = %x, remaplimit = %x\n", pvt->tolm, |
954 | 954 | pvt->remapbase, pvt->remaplimit); |
955 | 955 | |
956 | - if (edac_mc_add_mc(mci)) { | |
956 | + /* Here we assume that we will never see multiple instances of this | |
957 | + * type of memory controller. The ID is therefore hardcoded to 0. | |
958 | + */ | |
959 | + if (edac_mc_add_mc(mci,0)) { | |
957 | 960 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); |
958 | 961 | goto fail; |
959 | 962 | } |
drivers/edac/e7xxx_edac.c
... | ... | @@ -463,7 +463,10 @@ |
463 | 463 | /* clear any pending errors, or initial state bits */ |
464 | 464 | e7xxx_get_error_info(mci, &discard); |
465 | 465 | |
466 | - if (edac_mc_add_mc(mci) != 0) { | |
466 | + /* Here we assume that we will never see multiple instances of this | |
467 | + * type of memory controller. The ID is therefore hardcoded to 0. | |
468 | + */ | |
469 | + if (edac_mc_add_mc(mci,0)) { | |
467 | 470 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); |
468 | 471 | goto fail; |
469 | 472 | } |
drivers/edac/edac_mc.c
... | ... | @@ -1632,47 +1632,46 @@ |
1632 | 1632 | return NULL; |
1633 | 1633 | } |
1634 | 1634 | |
1635 | -static int add_mc_to_global_list(struct mem_ctl_info *mci) | |
1635 | +/* Return 0 on success, 1 on failure. | |
1636 | + * Before calling this function, caller must | |
1637 | + * assign a unique value to mci->mc_idx. | |
1638 | + */ | |
1639 | +static int add_mc_to_global_list (struct mem_ctl_info *mci) | |
1636 | 1640 | { |
1637 | 1641 | struct list_head *item, *insert_before; |
1638 | 1642 | struct mem_ctl_info *p; |
1639 | - int i; | |
1640 | 1643 | |
1641 | - if (list_empty(&mc_devices)) { | |
1642 | - mci->mc_idx = 0; | |
1643 | - insert_before = &mc_devices; | |
1644 | - } else { | |
1645 | - if (find_mci_by_dev(mci->dev)) { | |
1646 | - edac_printk(KERN_WARNING, EDAC_MC, | |
1647 | - "%s (%s) %s %s already assigned %d\n", | |
1648 | - mci->dev->bus_id, dev_name(mci->dev), | |
1649 | - mci->mod_name, mci->ctl_name, | |
1650 | - mci->mc_idx); | |
1651 | - return 1; | |
1652 | - } | |
1644 | + insert_before = &mc_devices; | |
1653 | 1645 | |
1654 | - insert_before = NULL; | |
1655 | - i = 0; | |
1646 | + if (unlikely((p = find_mci_by_dev(mci->dev)) != NULL)) | |
1647 | + goto fail0; | |
1656 | 1648 | |
1657 | - list_for_each(item, &mc_devices) { | |
1658 | - p = list_entry(item, struct mem_ctl_info, link); | |
1649 | + list_for_each(item, &mc_devices) { | |
1650 | + p = list_entry(item, struct mem_ctl_info, link); | |
1659 | 1651 | |
1660 | - if (p->mc_idx != i) { | |
1661 | - insert_before = item; | |
1662 | - break; | |
1663 | - } | |
1652 | + if (p->mc_idx >= mci->mc_idx) { | |
1653 | + if (unlikely(p->mc_idx == mci->mc_idx)) | |
1654 | + goto fail1; | |
1664 | 1655 | |
1665 | - i++; | |
1656 | + insert_before = item; | |
1657 | + break; | |
1666 | 1658 | } |
1667 | - | |
1668 | - mci->mc_idx = i; | |
1669 | - | |
1670 | - if (insert_before == NULL) | |
1671 | - insert_before = &mc_devices; | |
1672 | 1659 | } |
1673 | 1660 | |
1674 | 1661 | list_add_tail_rcu(&mci->link, insert_before); |
1675 | 1662 | return 0; |
1663 | + | |
1664 | +fail0: | |
1665 | + edac_printk(KERN_WARNING, EDAC_MC, | |
1666 | + "%s (%s) %s %s already assigned %d\n", p->dev->bus_id, | |
1667 | + dev_name(p->dev), p->mod_name, p->ctl_name, p->mc_idx); | |
1668 | + return 1; | |
1669 | + | |
1670 | +fail1: | |
1671 | + edac_printk(KERN_WARNING, EDAC_MC, | |
1672 | + "bug in low-level driver: attempt to assign\n" | |
1673 | + " duplicate mc_idx %d in %s()\n", p->mc_idx, __func__); | |
1674 | + return 1; | |
1676 | 1675 | } |
1677 | 1676 | |
1678 | 1677 | static void complete_mc_list_del(struct rcu_head *head) |
... | ... | @@ -1696,6 +1695,7 @@ |
1696 | 1695 | * edac_mc_add_mc: Insert the 'mci' structure into the mci global list and |
1697 | 1696 | * create sysfs entries associated with mci structure |
1698 | 1697 | * @mci: pointer to the mci structure to be added to the list |
1698 | + * @mc_idx: A unique numeric identifier to be assigned to the 'mci' structure. | |
1699 | 1699 | * |
1700 | 1700 | * Return: |
1701 | 1701 | * 0 Success |
1702 | 1702 | |
... | ... | @@ -1703,9 +1703,10 @@ |
1703 | 1703 | */ |
1704 | 1704 | |
1705 | 1705 | /* FIXME - should a warning be printed if no error detection? correction? */ |
1706 | -int edac_mc_add_mc(struct mem_ctl_info *mci) | |
1706 | +int edac_mc_add_mc(struct mem_ctl_info *mci, int mc_idx) | |
1707 | 1707 | { |
1708 | 1708 | debugf0("%s()\n", __func__); |
1709 | + mci->mc_idx = mc_idx; | |
1709 | 1710 | #ifdef CONFIG_EDAC_DEBUG |
1710 | 1711 | if (edac_debug_level >= 3) |
1711 | 1712 | edac_mc_dump_mci(mci); |
drivers/edac/edac_mc.h
... | ... | @@ -417,7 +417,7 @@ |
417 | 417 | void edac_mc_dump_csrow(struct csrow_info *csrow); |
418 | 418 | #endif /* CONFIG_EDAC_DEBUG */ |
419 | 419 | |
420 | -extern int edac_mc_add_mc(struct mem_ctl_info *mci); | |
420 | +extern int edac_mc_add_mc(struct mem_ctl_info *mci,int mc_idx); | |
421 | 421 | extern struct mem_ctl_info * edac_mc_del_mc(struct device *dev); |
422 | 422 | extern int edac_mc_find_csrow_by_page(struct mem_ctl_info *mci, |
423 | 423 | unsigned long page); |
drivers/edac/i82860_edac.c
... | ... | @@ -208,7 +208,10 @@ |
208 | 208 | |
209 | 209 | i82860_get_error_info(mci, &discard); /* clear counters */ |
210 | 210 | |
211 | - if (edac_mc_add_mc(mci)) { | |
211 | + /* Here we assume that we will never see multiple instances of this | |
212 | + * type of memory controller. The ID is therefore hardcoded to 0. | |
213 | + */ | |
214 | + if (edac_mc_add_mc(mci,0)) { | |
212 | 215 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); |
213 | 216 | edac_mc_free(mci); |
214 | 217 | } else { |
drivers/edac/i82875p_edac.c
... | ... | @@ -390,7 +390,10 @@ |
390 | 390 | |
391 | 391 | i82875p_get_error_info(mci, &discard); /* clear counters */ |
392 | 392 | |
393 | - if (edac_mc_add_mc(mci)) { | |
393 | + /* Here we assume that we will never see multiple instances of this | |
394 | + * type of memory controller. The ID is therefore hardcoded to 0. | |
395 | + */ | |
396 | + if (edac_mc_add_mc(mci,0)) { | |
394 | 397 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); |
395 | 398 | goto fail3; |
396 | 399 | } |
drivers/edac/r82600_edac.c
... | ... | @@ -304,7 +304,10 @@ |
304 | 304 | |
305 | 305 | r82600_get_error_info(mci, &discard); /* clear counters */ |
306 | 306 | |
307 | - if (edac_mc_add_mc(mci)) { | |
307 | + /* Here we assume that we will never see multiple instances of this | |
308 | + * type of memory controller. The ID is therefore hardcoded to 0. | |
309 | + */ | |
310 | + if (edac_mc_add_mc(mci,0)) { | |
308 | 311 | debugf3("%s(): failed edac_mc_add_mc()\n", __func__); |
309 | 312 | goto fail; |
310 | 313 | } |