[PATCH 15/75] kobject: remove the static array for the name

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg Kroah-Hartman
Date: Friday, October 12, 2007 - 3:16 pm

Due to historical reasons, struct kobject contained a static array for
the name, and a dynamic pointer in case the name got bigger than the
array.  That's just dumb, as people didn't always know which variable to
reference, even with the accessor for the kobject name.

This patch removes the static array, potentially saving a lot of memory
as the majority of kobjects do not have a very long name.

Thanks to Kay for the idea to do this.

Cc: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 include/linux/kobject.h |    7 ++--
 lib/kobject.c           |   79 +++++++++++++++++++++++------------------------
 2 files changed, 42 insertions(+), 44 deletions(-)

diff --git a/include/linux/kobject.h b/include/linux/kobject.h
index c0fb535..8b45946 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
@@ -63,7 +63,6 @@ extern const char *kobject_actions[];
 
 struct kobject {
 	const char		* k_name;
-	char			name[KOBJ_NAME_LEN];
 	struct kref		kref;
 	struct list_head	entry;
 	struct kobject		* parent;
@@ -188,18 +187,18 @@ extern struct kobject * kset_find_obj(struct kset *, const char *);
  * Use this when initializing an embedded kset with no other 
  * fields to initialize.
  */
-#define set_kset_name(str)	.kset = { .kobj = { .name = str } }
+#define set_kset_name(str)	.kset = { .kobj = { .k_name = str } }
 
 
 #define decl_subsys(_name,_type,_uevent_ops) \
 struct kset _name##_subsys = { \
-	.kobj = { .name = __stringify(_name) }, \
+	.kobj = { .k_name = __stringify(_name) }, \
 	.ktype = _type, \
 	.uevent_ops =_uevent_ops, \
 }
 #define decl_subsys_name(_varname,_name,_type,_uevent_ops) \
 struct kset _varname##_subsys = { \
-	.kobj = { .name = __stringify(_name) }, \
+	.kobj = { .k_name = __stringify(_name) }, \
 	.ktype = _type, \
 	.uevent_ops =_uevent_ops, \
 }
diff --git a/lib/kobject.c b/lib/kobject.c
index 1326041..10ae2eb 100644
--- a/lib/kobject.c
+++ b/lib/kobject.c
@@ -170,7 +170,7 @@ int kobject_shadow_add(struct kobject *kobj, struct sysfs_dirent *shadow_parent)
 	if (!(kobj = kobject_get(kobj)))
 		return -ENOENT;
 	if (!kobj->k_name)
-		kobj->k_name = kobj->name;
+		kobject_set_name(kobj, "NO_NAME");
 	if (!*kobj->k_name) {
 		pr_debug("kobject attempted to be registered with no name!\n");
 		WARN_ON(1);
@@ -181,7 +181,7 @@ int kobject_shadow_add(struct kobject *kobj, struct sysfs_dirent *shadow_parent)
 
 	pr_debug("kobject %s: registering. parent: %s, set: %s\n",
 		 kobject_name(kobj), parent ? kobject_name(parent) : "<NULL>", 
-		 kobj->kset ? kobj->kset->kobj.name : "<NULL>" );
+		 kobj->kset ? kobject_name(&kobj->kset->kobj) : "<NULL>" );
 
 	if (kobj->kset) {
 		spin_lock(&kobj->kset->list_lock);
@@ -255,54 +255,50 @@ int kobject_register(struct kobject * kobj)
 int kobject_set_name(struct kobject * kobj, const char * fmt, ...)
 {
 	int error = 0;
-	int limit = KOBJ_NAME_LEN;
+	int limit;
 	int need;
 	va_list args;
-	char * name;
+	char *name;
 
-	/* 
-	 * First, try the static array 
-	 */
-	va_start(args,fmt);
-	need = vsnprintf(kobj->name,limit,fmt,args);
+	/* find out how big a buffer we need */
+	name = kmalloc(1024, GFP_KERNEL);
+	if (!name) {
+		error = -ENOMEM;
+		goto done;
+	}
+	va_start(args, fmt);
+	need = vsnprintf(name, 1024, fmt, args);
 	va_end(args);
-	if (need < limit) 
-		name = kobj->name;
-	else {
-		/* 
-		 * Need more space? Allocate it and try again 
-		 */
-		limit = need + 1;
-		name = kmalloc(limit,GFP_KERNEL);
-		if (!name) {
-			error = -ENOMEM;
-			goto Done;
-		}
-		va_start(args,fmt);
-		need = vsnprintf(name,limit,fmt,args);
-		va_end(args);
-
-		/* Still? Give up. */
-		if (need >= limit) {
-			kfree(name);
-			error = -EFAULT;
-			goto Done;
-		}
+	kfree(name);
+
+	/* Allocate the new space and copy the string in */
+	limit = need + 1;
+	name = kmalloc(limit, GFP_KERNEL);
+	if (!name) {
+		error = -ENOMEM;
+		goto done;
+	}
+	va_start(args, fmt);
+	need = vsnprintf(name, limit, fmt, args);
+	va_end(args);
+
+	/* something wrong with the string we copied? */
+	if (need >= limit) {
+		kfree(name);
+		error = -EFAULT;
+		goto done;
 	}
 
 	/* Free the old name, if necessary. */
-	if (kobj->k_name && kobj->k_name != kobj->name)
-		kfree(kobj->k_name);
+	kfree(kobj->k_name);
 
 	/* Now, set the new name */
 	kobj->k_name = name;
- Done:
+done:
 	return error;
 }
-
 EXPORT_SYMBOL(kobject_set_name);
 
-
 /**
  *	kobject_rename - change the name of an object
  *	@kobj:	object in question.
@@ -477,13 +473,16 @@ void kobject_cleanup(struct kobject * kobj)
 	struct kobj_type * t = get_ktype(kobj);
 	struct kset * s = kobj->kset;
 	struct kobject * parent = kobj->parent;
+	const char *name = kobj->k_name;
 
 	pr_debug("kobject %s: cleaning up\n",kobject_name(kobj));
-	if (kobj->k_name != kobj->name)
-		kfree(kobj->k_name);
-	kobj->k_name = NULL;
-	if (t && t->release)
+	if (t && t->release) {
 		t->release(kobj);
+		/* If we have a release function, we can guess that this was
+		 * not a statically allocated kobject, so we should be safe to
+		 * free the name */
+		kfree(name);
+	}
 	if (s)
 		kset_put(s);
 	kobject_put(parent);
-- 
1.5.3.4

-
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 02/75] HOWTO: update ja_JP/HOWTO with latest changes, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 03/75] Driver core: make sysfs uevent-attributes static, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 04/75] Driver core: change add_uevent_var to use a ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 05/75] Driver core: add CONFIG_UEVENT_HELPER_PATH, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 06/75] Driver core: remove subsys_set_kset, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 07/75] Driver core: remove kset_set_kset_s, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 08/75] Driver core: remove subsys_put(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 09/75] Driver core: remove subsys_get(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 10/75] Driver core: remove put_bus(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 11/75] Driver core: remove get_bus(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 12/75] kobjects: fix up improper use of the kobject ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 13/75] cdev: remove unneeded setting of cdev names, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 14/75] Drivers: clean up direct setting of the name ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 15/75] kobject: remove the static array for the name, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 16/75] Driver core: clean up removed functions from ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 17/75] debugfs: helper for decimal challenged, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 18/75] sysfs/file.c - use mutex instead of semaphore, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 19/75] sysfs: cleanup semaphore.h, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 20/75] sysfs: Remove first pass at shadow directory ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 21/75] sysfs: cosmetic changes in sysfs_lookup(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 22/75] sysfs: simplify sysfs_rename_dir(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 23/75] sysfs: make sysfs_add/remove_one() call link ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 24/75] sysfs: make sysfs_add_one() automatically ch ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 25/75] sysfs: make sysfs_addrm_finish() return void, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 26/75] dmi-id: Use dynamic sysfs attributes, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 27/75] dmi-id: Possible cleanup, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 28/75] Convert from class_device to device for driv ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 29/75] Convert from class_device to device in drive ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 30/75] Driver core: exclude kobject_uevent.c for !C ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 31/75] Driver core: add uevent file for bus and driver, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 32/75] Driver core: kerneldoc - kobject_uevent_env ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 33/75] Fix Firmware class name collision, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 34/75] drivers/base/power/: make 2 functions static, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 35/75] sysfs: Fix typos in fs/sysfs/file.c, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 36/75] sysdev: remove global sysdev drivers list, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 37/75] Driver core: Make platform_device.id an int, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 38/75] sysfs: fix i_mutex locking in sysfs_get_dentry(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 39/75] sysfs: Move all of inode initialization into ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 40/75] sysfs: Remove sysfs_instantiate, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 41/75] sysfs: Use kill_anon_super, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 42/75] sysfs: Make sysfs_mount static, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 43/75] sysfs: In sysfs_lookup don't open code sysfs ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 44/75] sysfs: Simplify readdir., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 45/75] sysfs: Rewrite sysfs_drop_dentry., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 46/75] sysfs: Introduce sysfs_rename_mutex, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 47/75] sysfs: simply sysfs_get_dentry, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 48/75] sysfs: Remove s_dentry, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 49/75] sysfs: Rewrite rename in terms of sysfs dirents, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 50/75] sysfs: Rewrite sysfs_move_dir in terms of sy ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 51/75] PTY: add kernel parameter to overwrite legac ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 52/75] sysfs: spit a warning to users when they try ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 53/75] sysfs: fix comments of sysfs_add/remove_one(), Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 54/75] sysfs: fix sysfs_chmod_file() such that it u ..., Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 55/75] sysfs: clean up header files, Greg Kroah-Hartman, (Fri Oct 12, 3:16 pm)
[PATCH 56/75] sysfs: kill sysfs_update_file(), Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 57/75] sysfs: reposition sysfs_dirent-&gt;s_mode., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 58/75] sysfs: kill unnecessary sysfs_get() in open ..., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 59/75] sysfs: kill unnecessary NULL pointer check i ..., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 60/75] sysfs: make bin attr open get active referen ..., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 61/75] sysfs: make s_elem an anonymous union, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 62/75] sysfs: open code sysfs_attach_dentry(), Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 63/75] sysfs: make sysfs_root a regular directory d ..., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 65/75] sysfs: implement sysfs_open_dirent, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 66/75] sysfs: move sysfs file poll implementation t ..., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 67/75] driver core: remove subsystem_init(), Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 68/75] Driver core: rename ktype_class, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 69/75] Driver core: rename ktype_device, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 70/75] Driver core: rename ktype_driver, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 71/75] Driver core: rename ktype_edd and ktype_efivar, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 72/75] kset: add some kerneldoc to help describe wh ..., Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 73/75] kobject: update the copyrights, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 74/75] sysfs: add copyrights, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)
[PATCH 75/75] PM: merge device power-management source files, Greg Kroah-Hartman, (Fri Oct 12, 3:17 pm)