static int vphn_enabled;
 static int prrn_enabled;
 static void reset_topology_timer(void);
+static int topology_inited;
+static int topology_update_needed;
 
 /*
  * Store the current values of the associativity change counters in the
                        "hcall_vphn() experienced a hardware fault "
                        "preventing VPHN. Disabling polling...\n");
                stop_topology_update();
+               break;
+       case H_SUCCESS:
+               dbg("VPHN hcall succeeded. Reset polling...\n");
+               break;
        }
 
        return rc;
        struct device *dev;
        int weight, new_nid, i = 0;
 
-       if (!prrn_enabled && !vphn_enabled)
+       if (!prrn_enabled && !vphn_enabled) {
+               if (!topology_inited)
+                       topology_update_needed = 1;
                return 0;
+       }
 
        weight = cpumask_weight(&cpu_associativity_changes_mask);
        if (!weight)
                        cpumask_andnot(&cpu_associativity_changes_mask,
                                        &cpu_associativity_changes_mask,
                                        cpu_sibling_mask(cpu));
+                       dbg("Assoc chg gives same node %d for cpu%d\n",
+                                       new_nid, cpu);
                        cpu = cpu_last_thread_sibling(cpu);
                        continue;
                }
 
 out:
        kfree(updates);
+       topology_update_needed = 0;
        return changed;
 }
 
        if (topology_updates_enabled)
                start_topology_update();
 
+       if (vphn_enabled)
+               topology_schedule_update();
+
        if (!proc_create("powerpc/topology_updates", 0644, NULL, &topology_ops))
                return -ENOMEM;
 
+       topology_inited = 1;
+       if (topology_update_needed)
+               bitmap_fill(cpumask_bits(&cpu_associativity_changes_mask),
+                                       nr_cpumask_bits);
+
        return 0;
 }
 device_initcall(topology_update_init);