|
@@ -468,28 +468,23 @@ static int add_memory_block(int nid, struct mem_section *section,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * For now, we have a linear search to go find the appropriate
|
|
|
- * memory_block corresponding to a particular phys_index. If
|
|
|
- * this gets to be a real problem, we can always use a radix
|
|
|
- * tree or something here.
|
|
|
- *
|
|
|
- * This could be made generic for all sysdev classes.
|
|
|
- */
|
|
|
-struct memory_block *find_memory_block(struct mem_section *section)
|
|
|
+struct memory_block *find_memory_block_hinted(struct mem_section *section,
|
|
|
+ struct memory_block *hint)
|
|
|
{
|
|
|
struct kobject *kobj;
|
|
|
struct sys_device *sysdev;
|
|
|
struct memory_block *mem;
|
|
|
char name[sizeof(MEMORY_CLASS_NAME) + 9 + 1];
|
|
|
|
|
|
+ kobj = hint ? &hint->sysdev.kobj : NULL;
|
|
|
+
|
|
|
/*
|
|
|
* This only works because we know that section == sysdev->id
|
|
|
* slightly redundant with sysdev_register()
|
|
|
*/
|
|
|
sprintf(&name[0], "%s%d", MEMORY_CLASS_NAME, __section_nr(section));
|
|
|
|
|
|
- kobj = kset_find_obj(&memory_sysdev_class.kset, name);
|
|
|
+ kobj = kset_find_obj_hinted(&memory_sysdev_class.kset, name, kobj);
|
|
|
if (!kobj)
|
|
|
return NULL;
|
|
|
|
|
@@ -499,6 +494,19 @@ struct memory_block *find_memory_block(struct mem_section *section)
|
|
|
return mem;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * For now, we have a linear search to go find the appropriate
|
|
|
+ * memory_block corresponding to a particular phys_index. If
|
|
|
+ * this gets to be a real problem, we can always use a radix
|
|
|
+ * tree or something here.
|
|
|
+ *
|
|
|
+ * This could be made generic for all sysdev classes.
|
|
|
+ */
|
|
|
+struct memory_block *find_memory_block(struct mem_section *section)
|
|
|
+{
|
|
|
+ return find_memory_block_hinted(section, NULL);
|
|
|
+}
|
|
|
+
|
|
|
int remove_memory_block(unsigned long node_id, struct mem_section *section,
|
|
|
int phys_device)
|
|
|
{
|