]> git.ipfire.org Git - thirdparty/xtables-addons.git/commitdiff
quota2: reduce memory footprint for anonymous counters
authorJan Engelhardt <jengelh@medozas.de>
Fri, 3 Jul 2009 23:53:14 +0000 (01:53 +0200)
committerJan Engelhardt <jengelh@medozas.de>
Fri, 3 Jul 2009 23:53:35 +0000 (01:53 +0200)
48/64 bytes (32/64-bit arch, resp.) per counter.

doc/changelog.txt
extensions/xt_quota2.c

index 67f49c15fb5cf9986cfcf5c054e843f94c61ab50..0308fea84dfa94585da62bc1d8b5fa614d165fb4 100644 (file)
@@ -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)
index 932abe814d37631277e7353b88d0c29321a2c3d3..4fa04b986a011dbdd92996c03001a7a6dfcec0aa 100644 (file)
@@ -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;