Reduce memory consumption when allocating kobject strings in the

LinuxKPI. Compute string length before allocating memory instead of
using fixed size allocations. Make kobject_set_name_vargs() global
instead of inline to save some bytes when compiling.

MFC after:	1 week
Sponsored by:	Mellanox Technologies
This commit is contained in:
Hans Petter Selasky 2015-12-28 18:20:05 +00:00
parent ed27536fd5
commit 260194052e
2 changed files with 45 additions and 24 deletions

View File

@ -103,29 +103,7 @@ kobject_get(struct kobject *kobj)
return kobj;
}
static inline int
kobject_set_name_vargs(struct kobject *kobj, const char *fmt, va_list args)
{
char *old;
char *name;
old = kobj->name;
if (old && !fmt)
return 0;
name = kzalloc(MAXPATHLEN, GFP_KERNEL);
if (!name)
return -ENOMEM;
vsnprintf(name, MAXPATHLEN, fmt, args);
kobj->name = name;
kfree(old);
for (; *name != '\0'; name++)
if (*name == '/')
*name = '!';
return (0);
}
int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, va_list);
int kobject_add(struct kobject *kobj, struct kobject *parent,
const char *fmt, ...);

View File

@ -94,7 +94,50 @@ panic_cmp(struct rb_node *one, struct rb_node *two)
}
RB_GENERATE(linux_root, rb_node, __entry, panic_cmp);
int
kobject_set_name_vargs(struct kobject *kobj, const char *fmt, va_list args)
{
va_list tmp_va;
int len;
char *old;
char *name;
char dummy;
old = kobj->name;
if (old && fmt == NULL)
return (0);
/* compute length of string */
va_copy(tmp_va, args);
len = vsnprintf(&dummy, 0, fmt, tmp_va);
va_end(tmp_va);
/* account for zero termination */
len++;
/* check for error */
if (len < 1)
return (-EINVAL);
/* allocate memory for string */
name = kzalloc(len, GFP_KERNEL);
if (name == NULL)
return (-ENOMEM);
vsnprintf(name, len, fmt, args);
kobj->name = name;
/* free old string */
kfree(old);
/* filter new string */
for (; *name != '\0'; name++)
if (*name == '/')
*name = '!';
return (0);
}
int
kobject_set_name(struct kobject *kobj, const char *fmt, ...)
{