From 4bf667d8eb589c5443edfc6051c7bb72ad9d5dd0 Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Sat, 4 Jul 2009 01:53:14 +0200 Subject: [PATCH] quota2: reduce memory footprint for anonymous counters 48/64 bytes (32/64-bit arch, resp.) per counter. --- doc/changelog.txt | 3 ++- extensions/xt_quota2.c | 22 +++++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/doc/changelog.txt b/doc/changelog.txt index 67f49c1..0308fea 100644 --- a/doc/changelog.txt +++ b/doc/changelog.txt @@ -1,7 +1,8 @@ - build: support for Linux 2.6.31-rc1 -- quota2: support nameless counters +- quota2: support anonymous counters +- quota2: reduce memory footprint for anonymous counters Xtables-addons 1.17 (June 16 2009) diff --git a/extensions/xt_quota2.c b/extensions/xt_quota2.c index 932abe8..4fa04b9 100644 --- a/extensions/xt_quota2.c +++ b/extensions/xt_quota2.c @@ -21,6 +21,9 @@ #include "xt_quota2.h" #include "compat_xtables.h" +/** + * @lock: lock to protect quota writers from each other + */ struct xt_quota_counter { u_int64_t quota; spinlock_t lock; @@ -72,19 +75,24 @@ static int quota_proc_write(struct file *file, const char __user *input, } static struct xt_quota_counter * -q2_new_counter(const struct xt_quota_mtinfo2 *q) +q2_new_counter(const struct xt_quota_mtinfo2 *q, bool anon) { struct xt_quota_counter *e; + unsigned int size; - e = kmalloc(sizeof(*e), GFP_KERNEL); + /* Do not need all the procfs things for anonymous counters. */ + size = anon ? offsetof(typeof(*e), list) : sizeof(*e); + e = kmalloc(size, GFP_KERNEL); if (e == NULL) return NULL; e->quota = q->quota; spin_lock_init(&e->lock); - INIT_LIST_HEAD(&e->list); - atomic_set(&e->ref, 1); - strncpy(e->name, q->name, sizeof(e->name)); + if (!anon) { + INIT_LIST_HEAD(&e->list); + atomic_set(&e->ref, 1); + strncpy(e->name, q->name, sizeof(e->name)); + } return e; } @@ -99,7 +107,7 @@ q2_get_counter(const struct xt_quota_mtinfo2 *q) struct xt_quota_counter *e; if (*q->name == '\0') - return q2_new_counter(q); + return q2_new_counter(q, true); spin_lock_bh(&counter_list_lock); list_for_each_entry(e, &counter_list, list) @@ -109,7 +117,7 @@ q2_get_counter(const struct xt_quota_mtinfo2 *q) return e; } - e = q2_new_counter(q); + e = q2_new_counter(q, false); if (e == NULL) goto out;