diff options
Diffstat (limited to 'drivers/edac/edac_mc_sysfs.c')
-rw-r--r-- | drivers/edac/edac_mc_sysfs.c | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c index ed0bc07b8503..0ca1ca71157f 100644 --- a/drivers/edac/edac_mc_sysfs.c +++ b/drivers/edac/edac_mc_sysfs.c | |||
@@ -180,6 +180,9 @@ static ssize_t csrow_size_show(struct device *dev, | |||
180 | int i; | 180 | int i; |
181 | u32 nr_pages = 0; | 181 | u32 nr_pages = 0; |
182 | 182 | ||
183 | if (csrow->mci->csbased) | ||
184 | return sprintf(data, "%u\n", PAGES_TO_MiB(csrow->nr_pages)); | ||
185 | |||
183 | for (i = 0; i < csrow->nr_channels; i++) | 186 | for (i = 0; i < csrow->nr_channels; i++) |
184 | nr_pages += csrow->channels[i]->dimm->nr_pages; | 187 | nr_pages += csrow->channels[i]->dimm->nr_pages; |
185 | return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages)); | 188 | return sprintf(data, "%u\n", PAGES_TO_MiB(nr_pages)); |
@@ -373,6 +376,7 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci, | |||
373 | csrow->dev.bus = &mci->bus; | 376 | csrow->dev.bus = &mci->bus; |
374 | device_initialize(&csrow->dev); | 377 | device_initialize(&csrow->dev); |
375 | csrow->dev.parent = &mci->dev; | 378 | csrow->dev.parent = &mci->dev; |
379 | csrow->mci = mci; | ||
376 | dev_set_name(&csrow->dev, "csrow%d", index); | 380 | dev_set_name(&csrow->dev, "csrow%d", index); |
377 | dev_set_drvdata(&csrow->dev, csrow); | 381 | dev_set_drvdata(&csrow->dev, csrow); |
378 | 382 | ||
@@ -468,8 +472,7 @@ static void edac_delete_csrow_objects(struct mem_ctl_info *mci) | |||
468 | device_remove_file(&csrow->dev, | 472 | device_remove_file(&csrow->dev, |
469 | dynamic_csrow_ce_count_attr[chan]); | 473 | dynamic_csrow_ce_count_attr[chan]); |
470 | } | 474 | } |
471 | put_device(&mci->csrows[i]->dev); | 475 | device_unregister(&mci->csrows[i]->dev); |
472 | device_del(&mci->csrows[i]->dev); | ||
473 | } | 476 | } |
474 | } | 477 | } |
475 | #endif | 478 | #endif |
@@ -777,10 +780,14 @@ static ssize_t mci_size_mb_show(struct device *dev, | |||
777 | for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) { | 780 | for (csrow_idx = 0; csrow_idx < mci->nr_csrows; csrow_idx++) { |
778 | struct csrow_info *csrow = mci->csrows[csrow_idx]; | 781 | struct csrow_info *csrow = mci->csrows[csrow_idx]; |
779 | 782 | ||
780 | for (j = 0; j < csrow->nr_channels; j++) { | 783 | if (csrow->mci->csbased) { |
781 | struct dimm_info *dimm = csrow->channels[j]->dimm; | 784 | total_pages += csrow->nr_pages; |
785 | } else { | ||
786 | for (j = 0; j < csrow->nr_channels; j++) { | ||
787 | struct dimm_info *dimm = csrow->channels[j]->dimm; | ||
782 | 788 | ||
783 | total_pages += dimm->nr_pages; | 789 | total_pages += dimm->nr_pages; |
790 | } | ||
784 | } | 791 | } |
785 | } | 792 | } |
786 | 793 | ||
@@ -838,14 +845,8 @@ static ssize_t edac_fake_inject_write(struct file *file, | |||
838 | return count; | 845 | return count; |
839 | } | 846 | } |
840 | 847 | ||
841 | static int debugfs_open(struct inode *inode, struct file *file) | ||
842 | { | ||
843 | file->private_data = inode->i_private; | ||
844 | return 0; | ||
845 | } | ||
846 | |||
847 | static const struct file_operations debug_fake_inject_fops = { | 848 | static const struct file_operations debug_fake_inject_fops = { |
848 | .open = debugfs_open, | 849 | .open = simple_open, |
849 | .write = edac_fake_inject_write, | 850 | .write = edac_fake_inject_write, |
850 | .llseek = generic_file_llseek, | 851 | .llseek = generic_file_llseek, |
851 | }; | 852 | }; |
@@ -1053,11 +1054,9 @@ fail: | |||
1053 | struct dimm_info *dimm = mci->dimms[i]; | 1054 | struct dimm_info *dimm = mci->dimms[i]; |
1054 | if (dimm->nr_pages == 0) | 1055 | if (dimm->nr_pages == 0) |
1055 | continue; | 1056 | continue; |
1056 | put_device(&dimm->dev); | 1057 | device_unregister(&dimm->dev); |
1057 | device_del(&dimm->dev); | ||
1058 | } | 1058 | } |
1059 | put_device(&mci->dev); | 1059 | device_unregister(&mci->dev); |
1060 | device_del(&mci->dev); | ||
1061 | bus_unregister(&mci->bus); | 1060 | bus_unregister(&mci->bus); |
1062 | kfree(mci->bus.name); | 1061 | kfree(mci->bus.name); |
1063 | return err; | 1062 | return err; |
@@ -1084,16 +1083,14 @@ void edac_remove_sysfs_mci_device(struct mem_ctl_info *mci) | |||
1084 | if (dimm->nr_pages == 0) | 1083 | if (dimm->nr_pages == 0) |
1085 | continue; | 1084 | continue; |
1086 | edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev)); | 1085 | edac_dbg(0, "removing device %s\n", dev_name(&dimm->dev)); |
1087 | put_device(&dimm->dev); | 1086 | device_unregister(&dimm->dev); |
1088 | device_del(&dimm->dev); | ||
1089 | } | 1087 | } |
1090 | } | 1088 | } |
1091 | 1089 | ||
1092 | void edac_unregister_sysfs(struct mem_ctl_info *mci) | 1090 | void edac_unregister_sysfs(struct mem_ctl_info *mci) |
1093 | { | 1091 | { |
1094 | edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); | 1092 | edac_dbg(1, "Unregistering device %s\n", dev_name(&mci->dev)); |
1095 | put_device(&mci->dev); | 1093 | device_unregister(&mci->dev); |
1096 | device_del(&mci->dev); | ||
1097 | bus_unregister(&mci->bus); | 1094 | bus_unregister(&mci->bus); |
1098 | kfree(mci->bus.name); | 1095 | kfree(mci->bus.name); |
1099 | } | 1096 | } |
@@ -1124,10 +1121,15 @@ int __init edac_mc_sysfs_init(void) | |||
1124 | edac_subsys = edac_get_sysfs_subsys(); | 1121 | edac_subsys = edac_get_sysfs_subsys(); |
1125 | if (edac_subsys == NULL) { | 1122 | if (edac_subsys == NULL) { |
1126 | edac_dbg(1, "no edac_subsys\n"); | 1123 | edac_dbg(1, "no edac_subsys\n"); |
1127 | return -EINVAL; | 1124 | err = -EINVAL; |
1125 | goto out; | ||
1128 | } | 1126 | } |
1129 | 1127 | ||
1130 | mci_pdev = kzalloc(sizeof(*mci_pdev), GFP_KERNEL); | 1128 | mci_pdev = kzalloc(sizeof(*mci_pdev), GFP_KERNEL); |
1129 | if (!mci_pdev) { | ||
1130 | err = -ENOMEM; | ||
1131 | goto out_put_sysfs; | ||
1132 | } | ||
1131 | 1133 | ||
1132 | mci_pdev->bus = edac_subsys; | 1134 | mci_pdev->bus = edac_subsys; |
1133 | mci_pdev->type = &mc_attr_type; | 1135 | mci_pdev->type = &mc_attr_type; |
@@ -1136,16 +1138,22 @@ int __init edac_mc_sysfs_init(void) | |||
1136 | 1138 | ||
1137 | err = device_add(mci_pdev); | 1139 | err = device_add(mci_pdev); |
1138 | if (err < 0) | 1140 | if (err < 0) |
1139 | return err; | 1141 | goto out_dev_free; |
1140 | 1142 | ||
1141 | edac_dbg(0, "device %s created\n", dev_name(mci_pdev)); | 1143 | edac_dbg(0, "device %s created\n", dev_name(mci_pdev)); |
1142 | 1144 | ||
1143 | return 0; | 1145 | return 0; |
1146 | |||
1147 | out_dev_free: | ||
1148 | kfree(mci_pdev); | ||
1149 | out_put_sysfs: | ||
1150 | edac_put_sysfs_subsys(); | ||
1151 | out: | ||
1152 | return err; | ||
1144 | } | 1153 | } |
1145 | 1154 | ||
1146 | void __exit edac_mc_sysfs_exit(void) | 1155 | void __exit edac_mc_sysfs_exit(void) |
1147 | { | 1156 | { |
1148 | put_device(mci_pdev); | 1157 | device_unregister(mci_pdev); |
1149 | device_del(mci_pdev); | ||
1150 | edac_put_sysfs_subsys(); | 1158 | edac_put_sysfs_subsys(); |
1151 | } | 1159 | } |