static struct kobject edac_memctrl_kobj;
 static struct kobject edac_pci_kobj;
 
+/* We use these to wait for the reference counts on edac_memctrl_kobj and
+ * edac_pci_kobj to reach 0.
+ */
+static struct completion edac_memctrl_kobj_complete;
+static struct completion edac_pci_kobj_complete;
+
 /*
  * /sys/devices/system/edac/mc;
  *     data structures and methods
 static void edac_memctrl_master_release(struct kobject *kobj)
 {
        debugf1("%s()\n", __func__);
+       complete(&edac_memctrl_kobj_complete);
 }
 
 static struct kobj_type ktype_memctrl = {
 #ifndef DISABLE_EDAC_SYSFS
        debugf0("MC: " __FILE__ ": %s()\n", __func__);
 
-       /* Unregister the MC's kobject */
+       /* Unregister the MC's kobject and wait for reference count to reach
+        * 0.
+        */
+       init_completion(&edac_memctrl_kobj_complete);
        kobject_unregister(&edac_memctrl_kobj);
+       wait_for_completion(&edac_memctrl_kobj_complete);
 
        /* Unregister the 'edac' object */
        sysdev_class_unregister(&edac_class);
 static void edac_pci_release(struct kobject *kobj)
 {
        debugf1("%s()\n", __func__);
+       complete(&edac_pci_kobj_complete);
 }
 
 static struct kobj_type ktype_edac_pci = {
 {
 #ifndef DISABLE_EDAC_SYSFS
        debugf0("%s()\n", __func__);
-
+       init_completion(&edac_pci_kobj_complete);
        kobject_unregister(&edac_pci_kobj);
+       wait_for_completion(&edac_pci_kobj_complete);
 #endif
 }
 
 /* No memory to release */
 static void edac_csrow_instance_release(struct kobject *kobj)
 {
+       struct csrow_info *cs;
+
        debugf1("%s()\n", __func__);
+       cs = container_of(kobj, struct csrow_info, kobj);
+       complete(&cs->kobj_complete);
 }
 
 static struct kobj_type ktype_csrow = {
 static void edac_mci_instance_release(struct kobject *kobj)
 {
        struct mem_ctl_info *mci;
-       mci = container_of(kobj,struct mem_ctl_info,edac_mci_kobj);
 
-       debugf0("%s() idx=%d calling kfree\n", __func__, mci->mc_idx);
-
-       kfree(mci);
+       mci = to_mci(kobj);
+       debugf0("%s() idx=%d\n", __func__, mci->mc_idx);
+       complete(&mci->kobj_complete);
 }
 
 static struct kobj_type ktype_mci = {
                }
        }
 
-       /* Mark this MCI instance as having sysfs entries */
-       mci->sysfs_active = MCI_SYSFS_ACTIVE;
-
        return 0;
 
 
        /* CSROW error: backout what has already been registered,  */
 fail1:
        for ( i--; i >= 0; i--) {
-               if (csrow->nr_pages > 0)
+               if (csrow->nr_pages > 0) {
+                       init_completion(&csrow->kobj_complete);
                        kobject_unregister(&mci->csrows[i].kobj);
+                       wait_for_completion(&csrow->kobj_complete);
+               }
        }
 
 fail0:
+       init_completion(&mci->kobj_complete);
        kobject_unregister(edac_mci_kobj);
+       wait_for_completion(&mci->kobj_complete);
 
        return err;
 }
 
        /* remove all csrow kobjects */
        for (i = 0; i < mci->nr_csrows; i++) {
-               if (mci->csrows[i].nr_pages > 0)
+               if (mci->csrows[i].nr_pages > 0) {
+                       init_completion(&mci->csrows[i].kobj_complete);
                        kobject_unregister(&mci->csrows[i].kobj);
+                       wait_for_completion(&mci->csrows[i].kobj_complete);
+               }
        }
 
        sysfs_remove_link(&mci->edac_mci_kobj, EDAC_DEVICE_SYMLINK);
-
+       init_completion(&mci->kobj_complete);
        kobject_unregister(&mci->edac_mci_kobj);
+       wait_for_completion(&mci->kobj_complete);
 #endif  /* DISABLE_EDAC_SYSFS */
 }
 
 /**
  * edac_mc_free:  Free a previously allocated 'mci' structure
  * @mci: pointer to a struct mem_ctl_info structure
- *
- * Free up a previously allocated mci structure
- * A MCI structure can be in 2 states after being allocated
- * by edac_mc_alloc().
- *     1) Allocated in a MC driver's probe, but not yet committed
- *     2) Allocated and committed, by a call to  edac_mc_add_mc()
- * edac_mc_add_mc() is the function that adds the sysfs entries
- * thus, this free function must determine which state the 'mci'
- * structure is in, then either free it directly or
- * perform kobject cleanup by calling edac_remove_sysfs_mci_device().
- *
- * VOID Return
  */
 void edac_mc_free(struct mem_ctl_info *mci)
 {
-       /* only if sysfs entries for this mci instance exist
-        * do we remove them and defer the actual kfree via
-        * the kobject 'release()' callback.
-        *
-        * Otherwise, do a straight kfree now.
-        */
-       if (mci->sysfs_active == MCI_SYSFS_ACTIVE)
-               edac_remove_sysfs_mci_device(mci);
-       else
-               kfree(mci);
+       kfree(mci);
 }
 
 
 EXPORT_SYMBOL(edac_mc_add_mc);
 
 /**
- * edac_mc_add_mc: Insert the 'mci' structure into the mci global list
+ * edac_mc_add_mc: Insert the 'mci' structure into the mci global list and
+ *                 create sysfs entries associated with mci structure
  * @mci: pointer to the mci structure to be added to the list
  *
  * Return:
 EXPORT_SYMBOL(edac_mc_del_mc);
 
 /**
- * edac_mc_del_mc:  Remove the specified mci structure from global list
+ * edac_mc_del_mc: Remove sysfs entries for specified mci structure and
+ *                 remove mci structure from global list
  * @mci:       Pointer to struct mem_ctl_info structure
  *
  * Returns:
        int rc = 1;
 
        debugf0("MC%d: %s()\n", mci->mc_idx, __func__);
+       edac_remove_sysfs_mci_device(mci);
        down(&mem_ctls_mutex);
        del_mc_from_global_list(mci);
        edac_printk(KERN_INFO, EDAC_MC,