* [PATCH] SELinux - convert to kzalloc
@ 2005-09-13 15:18 James Morris
2005-09-13 19:07 ` Andrew Morton
2005-09-14 5:06 ` [PATCH] SELinux - convert to kzalloc Denis Vlasenko
0 siblings, 2 replies; 10+ messages in thread
From: James Morris @ 2005-09-13 15:18 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, Stephen Smalley
This patch converts SELinux code from kmalloc/memset to the new kazalloc
function. On i386, this results in a text saving of over 1K.
Before:
text data bss dec hex filename
86319 4642 15236 106197 19ed5 security/selinux/built-in.o
After:
text data bss dec hex filename
85278 4642 15236 105156 19ac4 security/selinux/built-in.o
Please apply.
Signed-off-by: James Morris <jmorris@namei.org>
Signed-off-by: Stephen Smalley <sds@tycho.nsa.gov>
---
security/selinux/hooks.c | 24 +++++------------
security/selinux/netif.c | 3 --
security/selinux/selinuxfs.c | 30 +++++++---------------
security/selinux/ss/conditional.c | 12 ++------
security/selinux/ss/ebitmap.c | 9 ++----
security/selinux/ss/hashtab.c | 6 +---
security/selinux/ss/policydb.c | 51 ++++++++++++--------------------------
security/selinux/ss/services.c | 9 ++----
8 files changed, 48 insertions(+), 96 deletions(-)
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/hooks.c linux-2.6.13-mm2.w/security/selinux/hooks.c
--- linux-2.6.13-mm2.o/security/selinux/hooks.c 2005-09-12 11:28:57.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/hooks.c 2005-09-13 10:24:43.000000000 -0400
@@ -122,11 +122,10 @@ static int task_alloc_security(struct ta
{
struct task_security_struct *tsec;
- tsec = kmalloc(sizeof(struct task_security_struct), GFP_KERNEL);
+ tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
if (!tsec)
return -ENOMEM;
- memset(tsec, 0, sizeof(struct task_security_struct));
tsec->magic = SELINUX_MAGIC;
tsec->task = task;
tsec->osid = tsec->sid = tsec->ptrace_sid = SECINITSID_UNLABELED;
@@ -151,11 +150,10 @@ static int inode_alloc_security(struct i
struct task_security_struct *tsec = current->security;
struct inode_security_struct *isec;
- isec = kmalloc(sizeof(struct inode_security_struct), GFP_KERNEL);
+ isec = kzalloc(sizeof(struct inode_security_struct), GFP_KERNEL);
if (!isec)
return -ENOMEM;
- memset(isec, 0, sizeof(struct inode_security_struct));
init_MUTEX(&isec->sem);
INIT_LIST_HEAD(&isec->list);
isec->magic = SELINUX_MAGIC;
@@ -193,11 +191,10 @@ static int file_alloc_security(struct fi
struct task_security_struct *tsec = current->security;
struct file_security_struct *fsec;
- fsec = kmalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
+ fsec = kzalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
if (!fsec)
return -ENOMEM;
- memset(fsec, 0, sizeof(struct file_security_struct));
fsec->magic = SELINUX_MAGIC;
fsec->file = file;
if (tsec && tsec->magic == SELINUX_MAGIC) {
@@ -227,11 +224,10 @@ static int superblock_alloc_security(str
{
struct superblock_security_struct *sbsec;
- sbsec = kmalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
+ sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
if (!sbsec)
return -ENOMEM;
- memset(sbsec, 0, sizeof(struct superblock_security_struct));
init_MUTEX(&sbsec->sem);
INIT_LIST_HEAD(&sbsec->list);
INIT_LIST_HEAD(&sbsec->isec_head);
@@ -269,11 +265,10 @@ static int sk_alloc_security(struct sock
if (family != PF_UNIX)
return 0;
- ssec = kmalloc(sizeof(*ssec), priority);
+ ssec = kzalloc(sizeof(*ssec), priority);
if (!ssec)
return -ENOMEM;
- memset(ssec, 0, sizeof(*ssec));
ssec->magic = SELINUX_MAGIC;
ssec->sk = sk;
ssec->peer_sid = SECINITSID_UNLABELED;
@@ -1467,11 +1462,10 @@ static int selinux_bprm_alloc_security(s
{
struct bprm_security_struct *bsec;
- bsec = kmalloc(sizeof(struct bprm_security_struct), GFP_KERNEL);
+ bsec = kzalloc(sizeof(struct bprm_security_struct), GFP_KERNEL);
if (!bsec)
return -ENOMEM;
- memset(bsec, 0, sizeof *bsec);
bsec->magic = SELINUX_MAGIC;
bsec->bprm = bprm;
bsec->sid = SECINITSID_UNLABELED;
@@ -3581,11 +3575,10 @@ static int ipc_alloc_security(struct tas
struct task_security_struct *tsec = task->security;
struct ipc_security_struct *isec;
- isec = kmalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
+ isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
if (!isec)
return -ENOMEM;
- memset(isec, 0, sizeof(struct ipc_security_struct));
isec->magic = SELINUX_MAGIC;
isec->sclass = sclass;
isec->ipc_perm = perm;
@@ -3613,11 +3606,10 @@ static int msg_msg_alloc_security(struct
{
struct msg_security_struct *msec;
- msec = kmalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
+ msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
if (!msec)
return -ENOMEM;
- memset(msec, 0, sizeof(struct msg_security_struct));
msec->magic = SELINUX_MAGIC;
msec->msg = msg;
msec->sid = SECINITSID_UNLABELED;
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/netif.c linux-2.6.13-mm2.w/security/selinux/netif.c
--- linux-2.6.13-mm2.o/security/selinux/netif.c 2005-03-02 02:38:09.000000000 -0500
+++ linux-2.6.13-mm2.w/security/selinux/netif.c 2005-09-13 10:25:21.000000000 -0400
@@ -114,13 +114,12 @@ static struct sel_netif *sel_netif_looku
if (likely(netif != NULL))
goto out;
- new = kmalloc(sizeof(*new), GFP_ATOMIC);
+ new = kzalloc(sizeof(*new), GFP_ATOMIC);
if (!new) {
netif = ERR_PTR(-ENOMEM);
goto out;
}
- memset(new, 0, sizeof(*new));
nsec = &new->nsec;
ret = security_netif_sid(dev->name, &nsec->if_sid, &nsec->msg_sid);
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/selinuxfs.c linux-2.6.13-mm2.w/security/selinux/selinuxfs.c
--- linux-2.6.13-mm2.o/security/selinux/selinuxfs.c 2005-08-29 00:36:42.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/selinuxfs.c 2005-09-13 10:23:33.000000000 -0400
@@ -424,15 +424,13 @@ static ssize_t sel_write_access(struct f
return length;
length = -ENOMEM;
- scon = kmalloc(size+1, GFP_KERNEL);
+ scon = kzalloc(size+1, GFP_KERNEL);
if (!scon)
return length;
- memset(scon, 0, size+1);
- tcon = kmalloc(size+1, GFP_KERNEL);
+ tcon = kzalloc(size+1, GFP_KERNEL);
if (!tcon)
goto out;
- memset(tcon, 0, size+1);
length = -EINVAL;
if (sscanf(buf, "%s %s %hu %x", scon, tcon, &tclass, &req) != 4)
@@ -475,15 +473,13 @@ static ssize_t sel_write_create(struct f
return length;
length = -ENOMEM;
- scon = kmalloc(size+1, GFP_KERNEL);
+ scon = kzalloc(size+1, GFP_KERNEL);
if (!scon)
return length;
- memset(scon, 0, size+1);
- tcon = kmalloc(size+1, GFP_KERNEL);
+ tcon = kzalloc(size+1, GFP_KERNEL);
if (!tcon)
goto out;
- memset(tcon, 0, size+1);
length = -EINVAL;
if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
@@ -536,15 +532,13 @@ static ssize_t sel_write_relabel(struct
return length;
length = -ENOMEM;
- scon = kmalloc(size+1, GFP_KERNEL);
+ scon = kzalloc(size+1, GFP_KERNEL);
if (!scon)
return length;
- memset(scon, 0, size+1);
- tcon = kmalloc(size+1, GFP_KERNEL);
+ tcon = kzalloc(size+1, GFP_KERNEL);
if (!tcon)
goto out;
- memset(tcon, 0, size+1);
length = -EINVAL;
if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
@@ -595,15 +589,13 @@ static ssize_t sel_write_user(struct fil
return length;
length = -ENOMEM;
- con = kmalloc(size+1, GFP_KERNEL);
+ con = kzalloc(size+1, GFP_KERNEL);
if (!con)
return length;
- memset(con, 0, size+1);
- user = kmalloc(size+1, GFP_KERNEL);
+ user = kzalloc(size+1, GFP_KERNEL);
if (!user)
goto out;
- memset(user, 0, size+1);
length = -EINVAL;
if (sscanf(buf, "%s %s", con, user) != 2)
@@ -658,15 +650,13 @@ static ssize_t sel_write_member(struct f
return length;
length = -ENOMEM;
- scon = kmalloc(size+1, GFP_KERNEL);
+ scon = kzalloc(size+1, GFP_KERNEL);
if (!scon)
return length;
- memset(scon, 0, size+1);
- tcon = kmalloc(size+1, GFP_KERNEL);
+ tcon = kzalloc(size+1, GFP_KERNEL);
if (!tcon)
goto out;
- memset(tcon, 0, size+1);
length = -EINVAL;
if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3)
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/conditional.c linux-2.6.13-mm2.w/security/selinux/ss/conditional.c
--- linux-2.6.13-mm2.o/security/selinux/ss/conditional.c 2005-09-12 11:28:57.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/ss/conditional.c 2005-09-13 10:22:26.000000000 -0400
@@ -220,10 +220,9 @@ int cond_read_bool(struct policydb *p, s
u32 len;
int rc;
- booldatum = kmalloc(sizeof(struct cond_bool_datum), GFP_KERNEL);
+ booldatum = kzalloc(sizeof(struct cond_bool_datum), GFP_KERNEL);
if (!booldatum)
return -1;
- memset(booldatum, 0, sizeof(struct cond_bool_datum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -321,10 +320,9 @@ static int cond_insertf(struct avtab *a,
goto err;
}
- list = kmalloc(sizeof(struct cond_av_list), GFP_KERNEL);
+ list = kzalloc(sizeof(struct cond_av_list), GFP_KERNEL);
if (!list)
goto err;
- memset(list, 0, sizeof(*list));
list->node = node_ptr;
if (!data->head)
@@ -414,11 +412,10 @@ static int cond_read_node(struct policyd
if (rc < 0)
goto err;
- expr = kmalloc(sizeof(struct cond_expr), GFP_KERNEL);
+ expr = kzalloc(sizeof(struct cond_expr), GFP_KERNEL);
if (!expr) {
goto err;
}
- memset(expr, 0, sizeof(struct cond_expr));
expr->expr_type = le32_to_cpu(buf[0]);
expr->bool = le32_to_cpu(buf[1]);
@@ -460,10 +457,9 @@ int cond_read_list(struct policydb *p, v
len = le32_to_cpu(buf[0]);
for (i = 0; i < len; i++) {
- node = kmalloc(sizeof(struct cond_node), GFP_KERNEL);
+ node = kzalloc(sizeof(struct cond_node), GFP_KERNEL);
if (!node)
goto err;
- memset(node, 0, sizeof(struct cond_node));
if (cond_read_node(p, node, fp) != 0)
goto err;
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/ebitmap.c linux-2.6.13-mm2.w/security/selinux/ss/ebitmap.c
--- linux-2.6.13-mm2.o/security/selinux/ss/ebitmap.c 2005-09-12 11:28:57.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/ss/ebitmap.c 2005-09-13 10:16:20.000000000 -0400
@@ -39,12 +39,11 @@ int ebitmap_cpy(struct ebitmap *dst, str
n = src->node;
prev = NULL;
while (n) {
- new = kmalloc(sizeof(*new), GFP_ATOMIC);
+ new = kzalloc(sizeof(*new), GFP_ATOMIC);
if (!new) {
ebitmap_destroy(dst);
return -ENOMEM;
}
- memset(new, 0, sizeof(*new));
new->startbit = n->startbit;
new->map = n->map;
new->next = NULL;
@@ -150,10 +149,9 @@ int ebitmap_set_bit(struct ebitmap *e, u
if (!value)
return 0;
- new = kmalloc(sizeof(*new), GFP_ATOMIC);
+ new = kzalloc(sizeof(*new), GFP_ATOMIC);
if (!new)
return -ENOMEM;
- memset(new, 0, sizeof(*new));
new->startbit = bit & ~(MAPSIZE - 1);
new->map = (MAPBIT << (bit - new->startbit));
@@ -232,13 +230,12 @@ int ebitmap_read(struct ebitmap *e, void
printk(KERN_ERR "security: ebitmap: truncated map\n");
goto bad;
}
- n = kmalloc(sizeof(*n), GFP_KERNEL);
+ n = kzalloc(sizeof(*n), GFP_KERNEL);
if (!n) {
printk(KERN_ERR "security: ebitmap: out of memory\n");
rc = -ENOMEM;
goto bad;
}
- memset(n, 0, sizeof(*n));
n->startbit = le32_to_cpu(buf[0]);
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/hashtab.c linux-2.6.13-mm2.w/security/selinux/ss/hashtab.c
--- linux-2.6.13-mm2.o/security/selinux/ss/hashtab.c 2005-06-19 13:29:33.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/ss/hashtab.c 2005-09-13 10:21:33.000000000 -0400
@@ -15,11 +15,10 @@ struct hashtab *hashtab_create(u32 (*has
struct hashtab *p;
u32 i;
- p = kmalloc(sizeof(*p), GFP_KERNEL);
+ p = kzalloc(sizeof(*p), GFP_KERNEL);
if (p == NULL)
return p;
- memset(p, 0, sizeof(*p));
p->size = size;
p->nel = 0;
p->hash_value = hash_value;
@@ -55,10 +54,9 @@ int hashtab_insert(struct hashtab *h, vo
if (cur && (h->keycmp(h, key, cur->key) == 0))
return -EEXIST;
- newnode = kmalloc(sizeof(*newnode), GFP_KERNEL);
+ newnode = kzalloc(sizeof(*newnode), GFP_KERNEL);
if (newnode == NULL)
return -ENOMEM;
- memset(newnode, 0, sizeof(*newnode));
newnode->key = key;
newnode->datum = datum;
if (prev) {
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/policydb.c linux-2.6.13-mm2.w/security/selinux/ss/policydb.c
--- linux-2.6.13-mm2.o/security/selinux/ss/policydb.c 2005-09-12 11:28:57.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/ss/policydb.c 2005-09-13 10:21:03.000000000 -0400
@@ -121,12 +121,11 @@ static int roles_init(struct policydb *p
int rc;
struct role_datum *role;
- role = kmalloc(sizeof(*role), GFP_KERNEL);
+ role = kzalloc(sizeof(*role), GFP_KERNEL);
if (!role) {
rc = -ENOMEM;
goto out;
}
- memset(role, 0, sizeof(*role));
role->value = ++p->p_roles.nprim;
if (role->value != OBJECT_R_VAL) {
rc = -EINVAL;
@@ -849,12 +848,11 @@ static int perm_read(struct policydb *p,
__le32 buf[2];
u32 len;
- perdatum = kmalloc(sizeof(*perdatum), GFP_KERNEL);
+ perdatum = kzalloc(sizeof(*perdatum), GFP_KERNEL);
if (!perdatum) {
rc = -ENOMEM;
goto out;
}
- memset(perdatum, 0, sizeof(*perdatum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -891,12 +889,11 @@ static int common_read(struct policydb *
u32 len, nel;
int i, rc;
- comdatum = kmalloc(sizeof(*comdatum), GFP_KERNEL);
+ comdatum = kzalloc(sizeof(*comdatum), GFP_KERNEL);
if (!comdatum) {
rc = -ENOMEM;
goto out;
}
- memset(comdatum, 0, sizeof(*comdatum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -948,10 +945,9 @@ static int read_cons_helper(struct const
lc = NULL;
for (i = 0; i < ncons; i++) {
- c = kmalloc(sizeof(*c), GFP_KERNEL);
+ c = kzalloc(sizeof(*c), GFP_KERNEL);
if (!c)
return -ENOMEM;
- memset(c, 0, sizeof(*c));
if (lc) {
lc->next = c;
@@ -967,10 +963,9 @@ static int read_cons_helper(struct const
le = NULL;
depth = -1;
for (j = 0; j < nexpr; j++) {
- e = kmalloc(sizeof(*e), GFP_KERNEL);
+ e = kzalloc(sizeof(*e), GFP_KERNEL);
if (!e)
return -ENOMEM;
- memset(e, 0, sizeof(*e));
if (le) {
le->next = e;
@@ -1031,12 +1026,11 @@ static int class_read(struct policydb *p
u32 len, len2, ncons, nel;
int i, rc;
- cladatum = kmalloc(sizeof(*cladatum), GFP_KERNEL);
+ cladatum = kzalloc(sizeof(*cladatum), GFP_KERNEL);
if (!cladatum) {
rc = -ENOMEM;
goto out;
}
- memset(cladatum, 0, sizeof(*cladatum));
rc = next_entry(buf, fp, sizeof(u32)*6);
if (rc < 0)
@@ -1125,12 +1119,11 @@ static int role_read(struct policydb *p,
__le32 buf[2];
u32 len;
- role = kmalloc(sizeof(*role), GFP_KERNEL);
+ role = kzalloc(sizeof(*role), GFP_KERNEL);
if (!role) {
rc = -ENOMEM;
goto out;
}
- memset(role, 0, sizeof(*role));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -1186,12 +1179,11 @@ static int type_read(struct policydb *p,
__le32 buf[3];
u32 len;
- typdatum = kmalloc(sizeof(*typdatum),GFP_KERNEL);
+ typdatum = kzalloc(sizeof(*typdatum),GFP_KERNEL);
if (!typdatum) {
rc = -ENOMEM;
return rc;
}
- memset(typdatum, 0, sizeof(*typdatum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -1259,12 +1251,11 @@ static int user_read(struct policydb *p,
__le32 buf[2];
u32 len;
- usrdatum = kmalloc(sizeof(*usrdatum), GFP_KERNEL);
+ usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL);
if (!usrdatum) {
rc = -ENOMEM;
goto out;
}
- memset(usrdatum, 0, sizeof(*usrdatum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -1314,12 +1305,11 @@ static int sens_read(struct policydb *p,
__le32 buf[2];
u32 len;
- levdatum = kmalloc(sizeof(*levdatum), GFP_ATOMIC);
+ levdatum = kzalloc(sizeof(*levdatum), GFP_ATOMIC);
if (!levdatum) {
rc = -ENOMEM;
goto out;
}
- memset(levdatum, 0, sizeof(*levdatum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -1366,12 +1356,11 @@ static int cat_read(struct policydb *p,
__le32 buf[3];
u32 len;
- catdatum = kmalloc(sizeof(*catdatum), GFP_ATOMIC);
+ catdatum = kzalloc(sizeof(*catdatum), GFP_ATOMIC);
if (!catdatum) {
rc = -ENOMEM;
goto out;
}
- memset(catdatum, 0, sizeof(*catdatum));
rc = next_entry(buf, fp, sizeof buf);
if (rc < 0)
@@ -1565,12 +1554,11 @@ int policydb_read(struct policydb *p, vo
nel = le32_to_cpu(buf[0]);
ltr = NULL;
for (i = 0; i < nel; i++) {
- tr = kmalloc(sizeof(*tr), GFP_KERNEL);
+ tr = kzalloc(sizeof(*tr), GFP_KERNEL);
if (!tr) {
rc = -ENOMEM;
goto bad;
}
- memset(tr, 0, sizeof(*tr));
if (ltr) {
ltr->next = tr;
} else {
@@ -1591,12 +1579,11 @@ int policydb_read(struct policydb *p, vo
nel = le32_to_cpu(buf[0]);
lra = NULL;
for (i = 0; i < nel; i++) {
- ra = kmalloc(sizeof(*ra), GFP_KERNEL);
+ ra = kzalloc(sizeof(*ra), GFP_KERNEL);
if (!ra) {
rc = -ENOMEM;
goto bad;
}
- memset(ra, 0, sizeof(*ra));
if (lra) {
lra->next = ra;
} else {
@@ -1625,12 +1612,11 @@ int policydb_read(struct policydb *p, vo
nel = le32_to_cpu(buf[0]);
l = NULL;
for (j = 0; j < nel; j++) {
- c = kmalloc(sizeof(*c), GFP_KERNEL);
+ c = kzalloc(sizeof(*c), GFP_KERNEL);
if (!c) {
rc = -ENOMEM;
goto bad;
}
- memset(c, 0, sizeof(*c));
if (l) {
l->next = c;
} else {
@@ -1741,12 +1727,11 @@ int policydb_read(struct policydb *p, vo
if (rc < 0)
goto bad;
len = le32_to_cpu(buf[0]);
- newgenfs = kmalloc(sizeof(*newgenfs), GFP_KERNEL);
+ newgenfs = kzalloc(sizeof(*newgenfs), GFP_KERNEL);
if (!newgenfs) {
rc = -ENOMEM;
goto bad;
}
- memset(newgenfs, 0, sizeof(*newgenfs));
newgenfs->fstype = kmalloc(len + 1,GFP_KERNEL);
if (!newgenfs->fstype) {
@@ -1788,12 +1773,11 @@ int policydb_read(struct policydb *p, vo
goto bad;
len = le32_to_cpu(buf[0]);
- newc = kmalloc(sizeof(*newc), GFP_KERNEL);
+ newc = kzalloc(sizeof(*newc), GFP_KERNEL);
if (!newc) {
rc = -ENOMEM;
goto bad;
}
- memset(newc, 0, sizeof(*newc));
newc->u.name = kmalloc(len + 1,GFP_KERNEL);
if (!newc->u.name) {
@@ -1841,12 +1825,11 @@ int policydb_read(struct policydb *p, vo
nel = le32_to_cpu(buf[0]);
lrt = NULL;
for (i = 0; i < nel; i++) {
- rt = kmalloc(sizeof(*rt), GFP_KERNEL);
+ rt = kzalloc(sizeof(*rt), GFP_KERNEL);
if (!rt) {
rc = -ENOMEM;
goto bad;
}
- memset(rt, 0, sizeof(*rt));
if (lrt)
lrt->next = rt;
else
diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/services.c linux-2.6.13-mm2.w/security/selinux/ss/services.c
--- linux-2.6.13-mm2.o/security/selinux/ss/services.c 2005-09-12 11:28:57.000000000 -0400
+++ linux-2.6.13-mm2.w/security/selinux/ss/services.c 2005-09-13 10:17:56.000000000 -0400
@@ -1531,12 +1531,11 @@ int security_get_user_sids(u32 fromsid,
}
usercon.user = user->value;
- mysids = kmalloc(maxnel*sizeof(*mysids), GFP_ATOMIC);
+ mysids = kzalloc(maxnel*sizeof(*mysids), GFP_ATOMIC);
if (!mysids) {
rc = -ENOMEM;
goto out_unlock;
}
- memset(mysids, 0, maxnel*sizeof(*mysids));
ebitmap_for_each_bit(&user->roles, rnode, i) {
if (!ebitmap_node_get_bit(rnode, i))
@@ -1566,13 +1565,12 @@ int security_get_user_sids(u32 fromsid,
mysids[mynel++] = sid;
} else {
maxnel += SIDS_NEL;
- mysids2 = kmalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC);
+ mysids2 = kzalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC);
if (!mysids2) {
rc = -ENOMEM;
kfree(mysids);
goto out_unlock;
}
- memset(mysids2, 0, maxnel*sizeof(*mysids2));
memcpy(mysids2, mysids, mynel * sizeof(*mysids2));
kfree(mysids);
mysids = mysids2;
@@ -1714,10 +1712,9 @@ int security_get_bools(int *len, char **
goto out;
}
- *names = (char**)kmalloc(sizeof(char*) * *len, GFP_ATOMIC);
+ *names = (char**)kzalloc(sizeof(char*) * *len, GFP_ATOMIC);
if (!*names)
goto err;
- memset(*names, 0, sizeof(char*) * *len);
*values = (int*)kmalloc(sizeof(int) * *len, GFP_ATOMIC);
if (!*values)
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH] SELinux - convert to kzalloc 2005-09-13 15:18 [PATCH] SELinux - convert to kzalloc James Morris @ 2005-09-13 19:07 ` Andrew Morton 2005-09-13 20:37 ` James Morris 2005-09-14 1:43 ` Roland Dreier 2005-09-14 5:06 ` [PATCH] SELinux - convert to kzalloc Denis Vlasenko 1 sibling, 2 replies; 10+ messages in thread From: Andrew Morton @ 2005-09-13 19:07 UTC (permalink / raw) To: James Morris; +Cc: linux-kernel, sds James Morris <jmorris@namei.org> wrote: > > This patch converts SELinux code from kmalloc/memset to the new kazalloc > function. On i386, this results in a text saving of over 1K. > > Before: > text data bss dec hex filename > 86319 4642 15236 106197 19ed5 security/selinux/built-in.o > > After: > text data bss dec hex filename > 85278 4642 15236 105156 19ac4 security/selinux/built-in.o > That's a nice size reduction. If we had kzalloc_gfp_kernel(size_t) we could drop an argument and save even more, but I suspect Linus would come after me with a cattle prod. Note that the use of kzalloc() will nullify kmalloc's compile-time optimisation where it determines which slab to use at compile time - kzalloc() won't know the size and will have to do the table search. But the performance benefit from text size reductions will balance that. SELinux seems to do a lot of kzalloc(a * b, flags): + mysids = kzalloc(maxnel*sizeof(*mysids), GFP_ATOMIC); + *names = (char**)kzalloc(sizeof(char*) * *len, GFP_ATOMIC); + mysids2 = kzalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC); Consider using kcalloc() here. ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] SELinux - convert to kzalloc 2005-09-13 19:07 ` Andrew Morton @ 2005-09-13 20:37 ` James Morris 2005-09-14 1:43 ` Roland Dreier 1 sibling, 0 replies; 10+ messages in thread From: James Morris @ 2005-09-13 20:37 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel, sds On Tue, 13 Sep 2005, Andrew Morton wrote: > SELinux seems to do a lot of kzalloc(a * b, flags): > > + mysids = kzalloc(maxnel*sizeof(*mysids), GFP_ATOMIC); > + *names = (char**)kzalloc(sizeof(char*) * *len, GFP_ATOMIC); > + mysids2 = kzalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC); > > Consider using kcalloc() here. Ok, updated patch below (found four of them). Signed-off-by: James Morris <jmorris@namei.org> --- security/selinux/hooks.c | 24 +++++------------ security/selinux/netif.c | 3 -- security/selinux/selinuxfs.c | 30 +++++++--------------- security/selinux/ss/conditional.c | 12 ++------ security/selinux/ss/ebitmap.c | 9 ++---- security/selinux/ss/hashtab.c | 6 +--- security/selinux/ss/policydb.c | 51 ++++++++++++-------------------------- security/selinux/ss/services.c | 11 ++------ 8 files changed, 49 insertions(+), 97 deletions(-) diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/hooks.c linux-2.6.13-mm2.w/security/selinux/hooks.c --- linux-2.6.13-mm2.o/security/selinux/hooks.c 2005-09-12 11:28:57.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/hooks.c 2005-09-13 16:23:44.000000000 -0400 @@ -122,11 +122,10 @@ static int task_alloc_security(struct ta { struct task_security_struct *tsec; - tsec = kmalloc(sizeof(struct task_security_struct), GFP_KERNEL); + tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL); if (!tsec) return -ENOMEM; - memset(tsec, 0, sizeof(struct task_security_struct)); tsec->magic = SELINUX_MAGIC; tsec->task = task; tsec->osid = tsec->sid = tsec->ptrace_sid = SECINITSID_UNLABELED; @@ -151,11 +150,10 @@ static int inode_alloc_security(struct i struct task_security_struct *tsec = current->security; struct inode_security_struct *isec; - isec = kmalloc(sizeof(struct inode_security_struct), GFP_KERNEL); + isec = kzalloc(sizeof(struct inode_security_struct), GFP_KERNEL); if (!isec) return -ENOMEM; - memset(isec, 0, sizeof(struct inode_security_struct)); init_MUTEX(&isec->sem); INIT_LIST_HEAD(&isec->list); isec->magic = SELINUX_MAGIC; @@ -193,11 +191,10 @@ static int file_alloc_security(struct fi struct task_security_struct *tsec = current->security; struct file_security_struct *fsec; - fsec = kmalloc(sizeof(struct file_security_struct), GFP_ATOMIC); + fsec = kzalloc(sizeof(struct file_security_struct), GFP_ATOMIC); if (!fsec) return -ENOMEM; - memset(fsec, 0, sizeof(struct file_security_struct)); fsec->magic = SELINUX_MAGIC; fsec->file = file; if (tsec && tsec->magic == SELINUX_MAGIC) { @@ -227,11 +224,10 @@ static int superblock_alloc_security(str { struct superblock_security_struct *sbsec; - sbsec = kmalloc(sizeof(struct superblock_security_struct), GFP_KERNEL); + sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL); if (!sbsec) return -ENOMEM; - memset(sbsec, 0, sizeof(struct superblock_security_struct)); init_MUTEX(&sbsec->sem); INIT_LIST_HEAD(&sbsec->list); INIT_LIST_HEAD(&sbsec->isec_head); @@ -269,11 +265,10 @@ static int sk_alloc_security(struct sock if (family != PF_UNIX) return 0; - ssec = kmalloc(sizeof(*ssec), priority); + ssec = kzalloc(sizeof(*ssec), priority); if (!ssec) return -ENOMEM; - memset(ssec, 0, sizeof(*ssec)); ssec->magic = SELINUX_MAGIC; ssec->sk = sk; ssec->peer_sid = SECINITSID_UNLABELED; @@ -1467,11 +1462,10 @@ static int selinux_bprm_alloc_security(s { struct bprm_security_struct *bsec; - bsec = kmalloc(sizeof(struct bprm_security_struct), GFP_KERNEL); + bsec = kzalloc(sizeof(struct bprm_security_struct), GFP_KERNEL); if (!bsec) return -ENOMEM; - memset(bsec, 0, sizeof *bsec); bsec->magic = SELINUX_MAGIC; bsec->bprm = bprm; bsec->sid = SECINITSID_UNLABELED; @@ -3581,11 +3575,10 @@ static int ipc_alloc_security(struct tas struct task_security_struct *tsec = task->security; struct ipc_security_struct *isec; - isec = kmalloc(sizeof(struct ipc_security_struct), GFP_KERNEL); + isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL); if (!isec) return -ENOMEM; - memset(isec, 0, sizeof(struct ipc_security_struct)); isec->magic = SELINUX_MAGIC; isec->sclass = sclass; isec->ipc_perm = perm; @@ -3613,11 +3606,10 @@ static int msg_msg_alloc_security(struct { struct msg_security_struct *msec; - msec = kmalloc(sizeof(struct msg_security_struct), GFP_KERNEL); + msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL); if (!msec) return -ENOMEM; - memset(msec, 0, sizeof(struct msg_security_struct)); msec->magic = SELINUX_MAGIC; msec->msg = msg; msec->sid = SECINITSID_UNLABELED; diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/netif.c linux-2.6.13-mm2.w/security/selinux/netif.c --- linux-2.6.13-mm2.o/security/selinux/netif.c 2005-03-02 02:38:09.000000000 -0500 +++ linux-2.6.13-mm2.w/security/selinux/netif.c 2005-09-13 16:23:44.000000000 -0400 @@ -114,13 +114,12 @@ static struct sel_netif *sel_netif_looku if (likely(netif != NULL)) goto out; - new = kmalloc(sizeof(*new), GFP_ATOMIC); + new = kzalloc(sizeof(*new), GFP_ATOMIC); if (!new) { netif = ERR_PTR(-ENOMEM); goto out; } - memset(new, 0, sizeof(*new)); nsec = &new->nsec; ret = security_netif_sid(dev->name, &nsec->if_sid, &nsec->msg_sid); diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/selinuxfs.c linux-2.6.13-mm2.w/security/selinux/selinuxfs.c --- linux-2.6.13-mm2.o/security/selinux/selinuxfs.c 2005-08-29 00:36:42.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/selinuxfs.c 2005-09-13 16:23:44.000000000 -0400 @@ -424,15 +424,13 @@ static ssize_t sel_write_access(struct f return length; length = -ENOMEM; - scon = kmalloc(size+1, GFP_KERNEL); + scon = kzalloc(size+1, GFP_KERNEL); if (!scon) return length; - memset(scon, 0, size+1); - tcon = kmalloc(size+1, GFP_KERNEL); + tcon = kzalloc(size+1, GFP_KERNEL); if (!tcon) goto out; - memset(tcon, 0, size+1); length = -EINVAL; if (sscanf(buf, "%s %s %hu %x", scon, tcon, &tclass, &req) != 4) @@ -475,15 +473,13 @@ static ssize_t sel_write_create(struct f return length; length = -ENOMEM; - scon = kmalloc(size+1, GFP_KERNEL); + scon = kzalloc(size+1, GFP_KERNEL); if (!scon) return length; - memset(scon, 0, size+1); - tcon = kmalloc(size+1, GFP_KERNEL); + tcon = kzalloc(size+1, GFP_KERNEL); if (!tcon) goto out; - memset(tcon, 0, size+1); length = -EINVAL; if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) @@ -536,15 +532,13 @@ static ssize_t sel_write_relabel(struct return length; length = -ENOMEM; - scon = kmalloc(size+1, GFP_KERNEL); + scon = kzalloc(size+1, GFP_KERNEL); if (!scon) return length; - memset(scon, 0, size+1); - tcon = kmalloc(size+1, GFP_KERNEL); + tcon = kzalloc(size+1, GFP_KERNEL); if (!tcon) goto out; - memset(tcon, 0, size+1); length = -EINVAL; if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) @@ -595,15 +589,13 @@ static ssize_t sel_write_user(struct fil return length; length = -ENOMEM; - con = kmalloc(size+1, GFP_KERNEL); + con = kzalloc(size+1, GFP_KERNEL); if (!con) return length; - memset(con, 0, size+1); - user = kmalloc(size+1, GFP_KERNEL); + user = kzalloc(size+1, GFP_KERNEL); if (!user) goto out; - memset(user, 0, size+1); length = -EINVAL; if (sscanf(buf, "%s %s", con, user) != 2) @@ -658,15 +650,13 @@ static ssize_t sel_write_member(struct f return length; length = -ENOMEM; - scon = kmalloc(size+1, GFP_KERNEL); + scon = kzalloc(size+1, GFP_KERNEL); if (!scon) return length; - memset(scon, 0, size+1); - tcon = kmalloc(size+1, GFP_KERNEL); + tcon = kzalloc(size+1, GFP_KERNEL); if (!tcon) goto out; - memset(tcon, 0, size+1); length = -EINVAL; if (sscanf(buf, "%s %s %hu", scon, tcon, &tclass) != 3) diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/conditional.c linux-2.6.13-mm2.w/security/selinux/ss/conditional.c --- linux-2.6.13-mm2.o/security/selinux/ss/conditional.c 2005-09-12 11:28:57.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/ss/conditional.c 2005-09-13 16:23:44.000000000 -0400 @@ -220,10 +220,9 @@ int cond_read_bool(struct policydb *p, s u32 len; int rc; - booldatum = kmalloc(sizeof(struct cond_bool_datum), GFP_KERNEL); + booldatum = kzalloc(sizeof(struct cond_bool_datum), GFP_KERNEL); if (!booldatum) return -1; - memset(booldatum, 0, sizeof(struct cond_bool_datum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -321,10 +320,9 @@ static int cond_insertf(struct avtab *a, goto err; } - list = kmalloc(sizeof(struct cond_av_list), GFP_KERNEL); + list = kzalloc(sizeof(struct cond_av_list), GFP_KERNEL); if (!list) goto err; - memset(list, 0, sizeof(*list)); list->node = node_ptr; if (!data->head) @@ -414,11 +412,10 @@ static int cond_read_node(struct policyd if (rc < 0) goto err; - expr = kmalloc(sizeof(struct cond_expr), GFP_KERNEL); + expr = kzalloc(sizeof(struct cond_expr), GFP_KERNEL); if (!expr) { goto err; } - memset(expr, 0, sizeof(struct cond_expr)); expr->expr_type = le32_to_cpu(buf[0]); expr->bool = le32_to_cpu(buf[1]); @@ -460,10 +457,9 @@ int cond_read_list(struct policydb *p, v len = le32_to_cpu(buf[0]); for (i = 0; i < len; i++) { - node = kmalloc(sizeof(struct cond_node), GFP_KERNEL); + node = kzalloc(sizeof(struct cond_node), GFP_KERNEL); if (!node) goto err; - memset(node, 0, sizeof(struct cond_node)); if (cond_read_node(p, node, fp) != 0) goto err; diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/ebitmap.c linux-2.6.13-mm2.w/security/selinux/ss/ebitmap.c --- linux-2.6.13-mm2.o/security/selinux/ss/ebitmap.c 2005-09-12 11:28:57.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/ss/ebitmap.c 2005-09-13 16:23:44.000000000 -0400 @@ -39,12 +39,11 @@ int ebitmap_cpy(struct ebitmap *dst, str n = src->node; prev = NULL; while (n) { - new = kmalloc(sizeof(*new), GFP_ATOMIC); + new = kzalloc(sizeof(*new), GFP_ATOMIC); if (!new) { ebitmap_destroy(dst); return -ENOMEM; } - memset(new, 0, sizeof(*new)); new->startbit = n->startbit; new->map = n->map; new->next = NULL; @@ -150,10 +149,9 @@ int ebitmap_set_bit(struct ebitmap *e, u if (!value) return 0; - new = kmalloc(sizeof(*new), GFP_ATOMIC); + new = kzalloc(sizeof(*new), GFP_ATOMIC); if (!new) return -ENOMEM; - memset(new, 0, sizeof(*new)); new->startbit = bit & ~(MAPSIZE - 1); new->map = (MAPBIT << (bit - new->startbit)); @@ -232,13 +230,12 @@ int ebitmap_read(struct ebitmap *e, void printk(KERN_ERR "security: ebitmap: truncated map\n"); goto bad; } - n = kmalloc(sizeof(*n), GFP_KERNEL); + n = kzalloc(sizeof(*n), GFP_KERNEL); if (!n) { printk(KERN_ERR "security: ebitmap: out of memory\n"); rc = -ENOMEM; goto bad; } - memset(n, 0, sizeof(*n)); n->startbit = le32_to_cpu(buf[0]); diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/hashtab.c linux-2.6.13-mm2.w/security/selinux/ss/hashtab.c --- linux-2.6.13-mm2.o/security/selinux/ss/hashtab.c 2005-06-19 13:29:33.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/ss/hashtab.c 2005-09-13 16:23:44.000000000 -0400 @@ -15,11 +15,10 @@ struct hashtab *hashtab_create(u32 (*has struct hashtab *p; u32 i; - p = kmalloc(sizeof(*p), GFP_KERNEL); + p = kzalloc(sizeof(*p), GFP_KERNEL); if (p == NULL) return p; - memset(p, 0, sizeof(*p)); p->size = size; p->nel = 0; p->hash_value = hash_value; @@ -55,10 +54,9 @@ int hashtab_insert(struct hashtab *h, vo if (cur && (h->keycmp(h, key, cur->key) == 0)) return -EEXIST; - newnode = kmalloc(sizeof(*newnode), GFP_KERNEL); + newnode = kzalloc(sizeof(*newnode), GFP_KERNEL); if (newnode == NULL) return -ENOMEM; - memset(newnode, 0, sizeof(*newnode)); newnode->key = key; newnode->datum = datum; if (prev) { diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/policydb.c linux-2.6.13-mm2.w/security/selinux/ss/policydb.c --- linux-2.6.13-mm2.o/security/selinux/ss/policydb.c 2005-09-12 11:28:57.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/ss/policydb.c 2005-09-13 16:23:44.000000000 -0400 @@ -121,12 +121,11 @@ static int roles_init(struct policydb *p int rc; struct role_datum *role; - role = kmalloc(sizeof(*role), GFP_KERNEL); + role = kzalloc(sizeof(*role), GFP_KERNEL); if (!role) { rc = -ENOMEM; goto out; } - memset(role, 0, sizeof(*role)); role->value = ++p->p_roles.nprim; if (role->value != OBJECT_R_VAL) { rc = -EINVAL; @@ -849,12 +848,11 @@ static int perm_read(struct policydb *p, __le32 buf[2]; u32 len; - perdatum = kmalloc(sizeof(*perdatum), GFP_KERNEL); + perdatum = kzalloc(sizeof(*perdatum), GFP_KERNEL); if (!perdatum) { rc = -ENOMEM; goto out; } - memset(perdatum, 0, sizeof(*perdatum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -891,12 +889,11 @@ static int common_read(struct policydb * u32 len, nel; int i, rc; - comdatum = kmalloc(sizeof(*comdatum), GFP_KERNEL); + comdatum = kzalloc(sizeof(*comdatum), GFP_KERNEL); if (!comdatum) { rc = -ENOMEM; goto out; } - memset(comdatum, 0, sizeof(*comdatum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -948,10 +945,9 @@ static int read_cons_helper(struct const lc = NULL; for (i = 0; i < ncons; i++) { - c = kmalloc(sizeof(*c), GFP_KERNEL); + c = kzalloc(sizeof(*c), GFP_KERNEL); if (!c) return -ENOMEM; - memset(c, 0, sizeof(*c)); if (lc) { lc->next = c; @@ -967,10 +963,9 @@ static int read_cons_helper(struct const le = NULL; depth = -1; for (j = 0; j < nexpr; j++) { - e = kmalloc(sizeof(*e), GFP_KERNEL); + e = kzalloc(sizeof(*e), GFP_KERNEL); if (!e) return -ENOMEM; - memset(e, 0, sizeof(*e)); if (le) { le->next = e; @@ -1031,12 +1026,11 @@ static int class_read(struct policydb *p u32 len, len2, ncons, nel; int i, rc; - cladatum = kmalloc(sizeof(*cladatum), GFP_KERNEL); + cladatum = kzalloc(sizeof(*cladatum), GFP_KERNEL); if (!cladatum) { rc = -ENOMEM; goto out; } - memset(cladatum, 0, sizeof(*cladatum)); rc = next_entry(buf, fp, sizeof(u32)*6); if (rc < 0) @@ -1125,12 +1119,11 @@ static int role_read(struct policydb *p, __le32 buf[2]; u32 len; - role = kmalloc(sizeof(*role), GFP_KERNEL); + role = kzalloc(sizeof(*role), GFP_KERNEL); if (!role) { rc = -ENOMEM; goto out; } - memset(role, 0, sizeof(*role)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -1186,12 +1179,11 @@ static int type_read(struct policydb *p, __le32 buf[3]; u32 len; - typdatum = kmalloc(sizeof(*typdatum),GFP_KERNEL); + typdatum = kzalloc(sizeof(*typdatum),GFP_KERNEL); if (!typdatum) { rc = -ENOMEM; return rc; } - memset(typdatum, 0, sizeof(*typdatum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -1259,12 +1251,11 @@ static int user_read(struct policydb *p, __le32 buf[2]; u32 len; - usrdatum = kmalloc(sizeof(*usrdatum), GFP_KERNEL); + usrdatum = kzalloc(sizeof(*usrdatum), GFP_KERNEL); if (!usrdatum) { rc = -ENOMEM; goto out; } - memset(usrdatum, 0, sizeof(*usrdatum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -1314,12 +1305,11 @@ static int sens_read(struct policydb *p, __le32 buf[2]; u32 len; - levdatum = kmalloc(sizeof(*levdatum), GFP_ATOMIC); + levdatum = kzalloc(sizeof(*levdatum), GFP_ATOMIC); if (!levdatum) { rc = -ENOMEM; goto out; } - memset(levdatum, 0, sizeof(*levdatum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -1366,12 +1356,11 @@ static int cat_read(struct policydb *p, __le32 buf[3]; u32 len; - catdatum = kmalloc(sizeof(*catdatum), GFP_ATOMIC); + catdatum = kzalloc(sizeof(*catdatum), GFP_ATOMIC); if (!catdatum) { rc = -ENOMEM; goto out; } - memset(catdatum, 0, sizeof(*catdatum)); rc = next_entry(buf, fp, sizeof buf); if (rc < 0) @@ -1565,12 +1554,11 @@ int policydb_read(struct policydb *p, vo nel = le32_to_cpu(buf[0]); ltr = NULL; for (i = 0; i < nel; i++) { - tr = kmalloc(sizeof(*tr), GFP_KERNEL); + tr = kzalloc(sizeof(*tr), GFP_KERNEL); if (!tr) { rc = -ENOMEM; goto bad; } - memset(tr, 0, sizeof(*tr)); if (ltr) { ltr->next = tr; } else { @@ -1591,12 +1579,11 @@ int policydb_read(struct policydb *p, vo nel = le32_to_cpu(buf[0]); lra = NULL; for (i = 0; i < nel; i++) { - ra = kmalloc(sizeof(*ra), GFP_KERNEL); + ra = kzalloc(sizeof(*ra), GFP_KERNEL); if (!ra) { rc = -ENOMEM; goto bad; } - memset(ra, 0, sizeof(*ra)); if (lra) { lra->next = ra; } else { @@ -1625,12 +1612,11 @@ int policydb_read(struct policydb *p, vo nel = le32_to_cpu(buf[0]); l = NULL; for (j = 0; j < nel; j++) { - c = kmalloc(sizeof(*c), GFP_KERNEL); + c = kzalloc(sizeof(*c), GFP_KERNEL); if (!c) { rc = -ENOMEM; goto bad; } - memset(c, 0, sizeof(*c)); if (l) { l->next = c; } else { @@ -1741,12 +1727,11 @@ int policydb_read(struct policydb *p, vo if (rc < 0) goto bad; len = le32_to_cpu(buf[0]); - newgenfs = kmalloc(sizeof(*newgenfs), GFP_KERNEL); + newgenfs = kzalloc(sizeof(*newgenfs), GFP_KERNEL); if (!newgenfs) { rc = -ENOMEM; goto bad; } - memset(newgenfs, 0, sizeof(*newgenfs)); newgenfs->fstype = kmalloc(len + 1,GFP_KERNEL); if (!newgenfs->fstype) { @@ -1788,12 +1773,11 @@ int policydb_read(struct policydb *p, vo goto bad; len = le32_to_cpu(buf[0]); - newc = kmalloc(sizeof(*newc), GFP_KERNEL); + newc = kzalloc(sizeof(*newc), GFP_KERNEL); if (!newc) { rc = -ENOMEM; goto bad; } - memset(newc, 0, sizeof(*newc)); newc->u.name = kmalloc(len + 1,GFP_KERNEL); if (!newc->u.name) { @@ -1841,12 +1825,11 @@ int policydb_read(struct policydb *p, vo nel = le32_to_cpu(buf[0]); lrt = NULL; for (i = 0; i < nel; i++) { - rt = kmalloc(sizeof(*rt), GFP_KERNEL); + rt = kzalloc(sizeof(*rt), GFP_KERNEL); if (!rt) { rc = -ENOMEM; goto bad; } - memset(rt, 0, sizeof(*rt)); if (lrt) lrt->next = rt; else diff -purN -X dontdiff linux-2.6.13-mm2.o/security/selinux/ss/services.c linux-2.6.13-mm2.w/security/selinux/ss/services.c --- linux-2.6.13-mm2.o/security/selinux/ss/services.c 2005-09-12 11:28:57.000000000 -0400 +++ linux-2.6.13-mm2.w/security/selinux/ss/services.c 2005-09-13 16:26:11.000000000 -0400 @@ -1531,12 +1531,11 @@ int security_get_user_sids(u32 fromsid, } usercon.user = user->value; - mysids = kmalloc(maxnel*sizeof(*mysids), GFP_ATOMIC); + mysids = kcalloc(maxnel, sizeof(*mysids), GFP_ATOMIC); if (!mysids) { rc = -ENOMEM; goto out_unlock; } - memset(mysids, 0, maxnel*sizeof(*mysids)); ebitmap_for_each_bit(&user->roles, rnode, i) { if (!ebitmap_node_get_bit(rnode, i)) @@ -1566,13 +1565,12 @@ int security_get_user_sids(u32 fromsid, mysids[mynel++] = sid; } else { maxnel += SIDS_NEL; - mysids2 = kmalloc(maxnel*sizeof(*mysids2), GFP_ATOMIC); + mysids2 = kcalloc(maxnel, sizeof(*mysids2), GFP_ATOMIC); if (!mysids2) { rc = -ENOMEM; kfree(mysids); goto out_unlock; } - memset(mysids2, 0, maxnel*sizeof(*mysids2)); memcpy(mysids2, mysids, mynel * sizeof(*mysids2)); kfree(mysids); mysids = mysids2; @@ -1714,12 +1712,11 @@ int security_get_bools(int *len, char ** goto out; } - *names = (char**)kmalloc(sizeof(char*) * *len, GFP_ATOMIC); + *names = (char**)kcalloc(*len, sizeof(char*), GFP_ATOMIC); if (!*names) goto err; - memset(*names, 0, sizeof(char*) * *len); - *values = (int*)kmalloc(sizeof(int) * *len, GFP_ATOMIC); + *values = (int*)kcalloc(*len, sizeof(int), GFP_ATOMIC); if (!*values) goto err; ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] SELinux - convert to kzalloc 2005-09-13 19:07 ` Andrew Morton 2005-09-13 20:37 ` James Morris @ 2005-09-14 1:43 ` Roland Dreier 2005-09-14 5:09 ` [PATCH] Create __kzalloc_gfp_kernel() Roland Dreier 1 sibling, 1 reply; 10+ messages in thread From: Roland Dreier @ 2005-09-14 1:43 UTC (permalink / raw) To: Andrew Morton; +Cc: James Morris, linux-kernel, sds Andrew> That's a nice size reduction. If we had Andrew> kzalloc_gfp_kernel(size_t) we could drop an argument and Andrew> save even more, but I suspect Linus would come after me Andrew> with a cattle prod. Could one make kzalloc() an inline and do some __builtin_constant_p() trickery on the flags parameter to get the same effect? I'll give it a try and see what happens. - R. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH] Create __kzalloc_gfp_kernel() 2005-09-14 1:43 ` Roland Dreier @ 2005-09-14 5:09 ` Roland Dreier 2005-09-14 5:35 ` Andrew Morton 0 siblings, 1 reply; 10+ messages in thread From: Roland Dreier @ 2005-09-14 5:09 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel Andrew, it turns out that your idea of kzalloc_gfp_kernel() does save a bit. Here's a patch that shouldn't even make Linus look for a cattle prod. [BTW, it's rather amusing watching ld use a gig of memory and several minutes of CPU time as it strains to link an allyesconfig kernel] - R. Here's a patch to get the effect of having kzalloc_gfp_kernel() without affecting any callers. It makes kzalloc() an inline that just calls __kzalloc_gfp_kernel() if the flags parameter is a compile-time constant and is GFP_KERNEL, and calls __kzalloc() otherwise. On an x86_64 allyesconfig kernel, I see the following size: text data bss dec hex filename 24202272 7609162 1998512 33809946 203e61a ../kbuild-before/vmlinux 24201601 7609266 1998512 33809379 203e3e3 ../kbuild-after/vmlinux for a net savings of 671 bytes of text (at a cost of 104 bytes of data for some reason). As use of kzalloc() becomes more widespread, this should get even better. Signed-off-by: Roland Dreier <rolandd@cisco.com> diff --git a/include/linux/slab.h b/include/linux/slab.h --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -99,7 +99,16 @@ found: return __kmalloc(size, flags); } -extern void *kzalloc(size_t, unsigned int __nocast); +extern void *__kzalloc(size_t, unsigned int __nocast); +extern void *__kzalloc_gfp_kernel(size_t); + +static inline void *kzalloc(size_t size, unsigned int __nocast flags) +{ + if (__builtin_constant_p(flags) && flags == GFP_KERNEL) + return __kzalloc_gfp_kernel(size); + else + return __kzalloc(size, flags); +} /** * kcalloc - allocate memory for an array. The memory is set to zero. diff --git a/mm/slab.c b/mm/slab.c --- a/mm/slab.c +++ b/mm/slab.c @@ -2985,14 +2985,20 @@ EXPORT_SYMBOL(kmem_cache_free); * @size: how many bytes of memory are required. * @flags: the type of memory to allocate. */ -void *kzalloc(size_t size, unsigned int __nocast flags) +void *__kzalloc(size_t size, unsigned int __nocast flags) { void *ret = kmalloc(size, flags); if (ret) memset(ret, 0, size); return ret; } -EXPORT_SYMBOL(kzalloc); +EXPORT_SYMBOL(__kzalloc); + +void *__kzalloc_gfp_kernel(size_t size) +{ + return __kzalloc(size, GFP_KERNEL); +} +EXPORT_SYMBOL(__kzalloc_gfp_kernel); /** * kfree - free previously allocated memory ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] Create __kzalloc_gfp_kernel() 2005-09-14 5:09 ` [PATCH] Create __kzalloc_gfp_kernel() Roland Dreier @ 2005-09-14 5:35 ` Andrew Morton 2005-09-14 18:39 ` [PATCH] Move GFP_KERNEL use out of line to shrink text Roland Dreier 0 siblings, 1 reply; 10+ messages in thread From: Andrew Morton @ 2005-09-14 5:35 UTC (permalink / raw) To: Roland Dreier; +Cc: linux-kernel Roland Dreier <rolandd@cisco.com> wrote: > > On an x86_64 allyesconfig kernel, I see the following size: > > text data bss dec hex filename > 24202272 7609162 1998512 33809946 203e61a ../kbuild-before/vmlinux > 24201601 7609266 1998512 33809379 203e3e3 ../kbuild-after/vmlinux > It hardly seems worth it, really. Better savings would come from doing the same trick to kmem_cache_alloc() then tweaking kmalloc(). There are probably any number of frequently-called functions which we could hack around with.. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH] Move GFP_KERNEL use out of line to shrink text 2005-09-14 5:35 ` Andrew Morton @ 2005-09-14 18:39 ` Roland Dreier 2005-09-15 5:13 ` Denis Vlasenko 0 siblings, 1 reply; 10+ messages in thread From: Roland Dreier @ 2005-09-14 18:39 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel Andrew> It hardly seems worth it, really. Better savings would Andrew> come from doing the same trick to kmem_cache_alloc() then Andrew> tweaking kmalloc(). Yep, right as usual; here's an updated patch. Do with it as you will -- I won't be hurt if you dump it, since I had fun trying this out. Reduce kernel text by moving many uses of GFP_KERNEL out of line, by creating __kmem_cache_alloc_gfp_kernel(), __kmalloc_gfp_kernel() and __kzalloc_gfp_kernel() wrapper functions. Then kmem_cache_alloc(), kmalloc() and kzalloc() can be inline functions that just call their _gfp_kernel version if their flags parameter is a compile-time constant and is GFP_KERNEL, and call their ordinary version otherwise. On an x86_64 allyesconfig kernel, I see the following sizes: text data bss dec hex filename 24202272 7609162 1998512 33809946 203e61a vmlinux-before 24197561 7609474 1998512 33805547 203d4eb vmlinux-after for a net savings of 4711 bytes of text (at a cost of 312 bytes of data for some reason). With my usual config, the patched kernel boots and runs fine. Signed-off-by: Roland Dreier <rolandd@cisco.com> diff --git a/include/linux/slab.h b/include/linux/slab.h --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -61,7 +61,8 @@ extern kmem_cache_t *kmem_cache_create(c void (*)(void *, kmem_cache_t *, unsigned long)); extern int kmem_cache_destroy(kmem_cache_t *); extern int kmem_cache_shrink(kmem_cache_t *); -extern void *kmem_cache_alloc(kmem_cache_t *, unsigned int __nocast); +extern void *__kmem_cache_alloc(kmem_cache_t *, unsigned int __nocast); +extern void *__kmem_cache_alloc_gfp_kernel(kmem_cache_t *); extern void kmem_cache_free(kmem_cache_t *, void *); extern unsigned int kmem_cache_size(kmem_cache_t *); extern const char *kmem_cache_name(kmem_cache_t *); @@ -75,6 +76,15 @@ struct cache_sizes { }; extern struct cache_sizes malloc_sizes[]; extern void *__kmalloc(size_t, unsigned int __nocast); +extern void *__kmalloc_gfp_kernel(size_t); + +static inline void *kmem_cache_alloc(kmem_cache_t *cache, unsigned int __nocast flags) +{ + if (__builtin_constant_p(flags) && flags == GFP_KERNEL) + return __kmem_cache_alloc_gfp_kernel(cache); + + return __kmem_cache_alloc(cache, flags); +} static inline void *kmalloc(size_t size, unsigned int __nocast flags) { @@ -96,10 +106,22 @@ found: malloc_sizes[i].cs_dmacachep : malloc_sizes[i].cs_cachep, flags); } + + if (__builtin_constant_p(flags) && flags == GFP_KERNEL) + return __kmalloc_gfp_kernel(size); return __kmalloc(size, flags); } -extern void *kzalloc(size_t, unsigned int __nocast); +extern void *__kzalloc(size_t, unsigned int __nocast); +extern void *__kzalloc_gfp_kernel(size_t); + +static inline void *kzalloc(size_t size, unsigned int __nocast flags) +{ + if (__builtin_constant_p(flags) && flags == GFP_KERNEL) + return __kzalloc_gfp_kernel(size); + + return __kzalloc(size, flags); +} /** * kcalloc - allocate memory for an array. The memory is set to zero. diff --git a/mm/slab.c b/mm/slab.c --- a/mm/slab.c +++ b/mm/slab.c @@ -2778,11 +2778,17 @@ static inline void __cache_free(kmem_cac * Allocate an object from this cache. The flags are only relevant * if the cache has no available objects. */ -void *kmem_cache_alloc(kmem_cache_t *cachep, unsigned int __nocast flags) +void *__kmem_cache_alloc(kmem_cache_t *cachep, unsigned int __nocast flags) { return __cache_alloc(cachep, flags); } -EXPORT_SYMBOL(kmem_cache_alloc); +EXPORT_SYMBOL(__kmem_cache_alloc); + +void *__kmem_cache_alloc_gfp_kernel(kmem_cache_t *cachep) +{ + return __cache_alloc(cachep, GFP_KERNEL); +} +EXPORT_SYMBOL(__kmem_cache_alloc_gfp_kernel); /** * kmem_ptr_validate - check if an untrusted pointer might @@ -2912,6 +2918,12 @@ void *__kmalloc(size_t size, unsigned in } EXPORT_SYMBOL(__kmalloc); +void *__kmalloc_gfp_kernel(size_t size) +{ + return __kmalloc(size, GFP_KERNEL); +} +EXPORT_SYMBOL(__kmalloc_gfp_kernel); + #ifdef CONFIG_SMP /** * __alloc_percpu - allocate one copy of the object for every present @@ -2985,14 +2997,20 @@ EXPORT_SYMBOL(kmem_cache_free); * @size: how many bytes of memory are required. * @flags: the type of memory to allocate. */ -void *kzalloc(size_t size, unsigned int __nocast flags) +void *__kzalloc(size_t size, unsigned int __nocast flags) { void *ret = kmalloc(size, flags); if (ret) memset(ret, 0, size); return ret; } -EXPORT_SYMBOL(kzalloc); +EXPORT_SYMBOL(__kzalloc); + +void *__kzalloc_gfp_kernel(size_t size) +{ + return __kzalloc(size, GFP_KERNEL); +} +EXPORT_SYMBOL(__kzalloc_gfp_kernel); /** * kfree - free previously allocated memory ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] Move GFP_KERNEL use out of line to shrink text 2005-09-14 18:39 ` [PATCH] Move GFP_KERNEL use out of line to shrink text Roland Dreier @ 2005-09-15 5:13 ` Denis Vlasenko 2005-09-15 11:42 ` Paulo Marques 0 siblings, 1 reply; 10+ messages in thread From: Denis Vlasenko @ 2005-09-15 5:13 UTC (permalink / raw) To: Roland Dreier; +Cc: Andrew Morton, linux-kernel On Wednesday 14 September 2005 21:39, Roland Dreier wrote: > text data bss dec hex filename > 24202272 7609162 1998512 33809946 203e61a vmlinux-before > 24197561 7609474 1998512 33805547 203d4eb vmlinux-after > > for a net savings of 4711 bytes of text (at a cost of 312 bytes of > data for some reason). With my usual config, the patched kernel boots > and runs fine. FYI: "some reason" == KALLSYMS -- vda ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] Move GFP_KERNEL use out of line to shrink text 2005-09-15 5:13 ` Denis Vlasenko @ 2005-09-15 11:42 ` Paulo Marques 0 siblings, 0 replies; 10+ messages in thread From: Paulo Marques @ 2005-09-15 11:42 UTC (permalink / raw) To: Denis Vlasenko; +Cc: Roland Dreier, Andrew Morton, linux-kernel Denis Vlasenko wrote: > On Wednesday 14 September 2005 21:39, Roland Dreier wrote: > >> text data bss dec hex filename >> 24202272 7609162 1998512 33809946 203e61a vmlinux-before >> 24197561 7609474 1998512 33805547 203d4eb vmlinux-after >> >>for a net savings of 4711 bytes of text (at a cost of 312 bytes of >>data for some reason). With my usual config, the patched kernel boots >>and runs fine. > > FYI: "some reason" == KALLSYMS 312 bytes for a couple more symbols is too much to be justified from kallsyms alone. In a 64 bit machine each new symbol should take about 8 bytes for the address + ~ half the size of the symbol name, which in this case would give at most about ~50 bytes. I guess the rest should come from the extra EXPORT_SYMBOL's... -- Paulo Marques - www.grupopie.com The rule is perfect: in all matters of opinion our adversaries are insane. Mark Twain ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] SELinux - convert to kzalloc 2005-09-13 15:18 [PATCH] SELinux - convert to kzalloc James Morris 2005-09-13 19:07 ` Andrew Morton @ 2005-09-14 5:06 ` Denis Vlasenko 1 sibling, 0 replies; 10+ messages in thread From: Denis Vlasenko @ 2005-09-14 5:06 UTC (permalink / raw) To: James Morris; +Cc: Andrew Morton, linux-kernel, Stephen Smalley On Tuesday 13 September 2005 18:18, James Morris wrote: > - *names = (char**)kmalloc(sizeof(char*) * *len, GFP_ATOMIC); > + *names = (char**)kzalloc(sizeof(char*) * *len, GFP_ATOMIC); Extra cast -- vda ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2005-09-15 11:42 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2005-09-13 15:18 [PATCH] SELinux - convert to kzalloc James Morris 2005-09-13 19:07 ` Andrew Morton 2005-09-13 20:37 ` James Morris 2005-09-14 1:43 ` Roland Dreier 2005-09-14 5:09 ` [PATCH] Create __kzalloc_gfp_kernel() Roland Dreier 2005-09-14 5:35 ` Andrew Morton 2005-09-14 18:39 ` [PATCH] Move GFP_KERNEL use out of line to shrink text Roland Dreier 2005-09-15 5:13 ` Denis Vlasenko 2005-09-15 11:42 ` Paulo Marques 2005-09-14 5:06 ` [PATCH] SELinux - convert to kzalloc Denis Vlasenko
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox