|
@@ -26,6 +26,7 @@
|
|
|
#include <linux/spinlock.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
#include <linux/smp.h>
|
|
|
+#include <linux/cpumask.h>
|
|
|
#include <net/sock.h>
|
|
|
/* needed for logical [in,out]-dev filtering */
|
|
|
#include "../br_private.h"
|
|
@@ -823,10 +824,11 @@ static int translate_table(struct ebt_replace *repl,
|
|
|
/* this will get free'd in do_replace()/ebt_register_table()
|
|
|
if an error occurs */
|
|
|
newinfo->chainstack = (struct ebt_chainstack **)
|
|
|
- vmalloc(num_possible_cpus() * sizeof(struct ebt_chainstack));
|
|
|
+ vmalloc((highest_possible_processor_id()+1)
|
|
|
+ * sizeof(struct ebt_chainstack));
|
|
|
if (!newinfo->chainstack)
|
|
|
return -ENOMEM;
|
|
|
- for (i = 0; i < num_possible_cpus(); i++) {
|
|
|
+ for_each_cpu(i) {
|
|
|
newinfo->chainstack[i] =
|
|
|
vmalloc(udc_cnt * sizeof(struct ebt_chainstack));
|
|
|
if (!newinfo->chainstack[i]) {
|
|
@@ -895,9 +897,12 @@ static void get_counters(struct ebt_counter *oldcounters,
|
|
|
|
|
|
/* counters of cpu 0 */
|
|
|
memcpy(counters, oldcounters,
|
|
|
- sizeof(struct ebt_counter) * nentries);
|
|
|
+ sizeof(struct ebt_counter) * nentries);
|
|
|
+
|
|
|
/* add other counters to those of cpu 0 */
|
|
|
- for (cpu = 1; cpu < num_possible_cpus(); cpu++) {
|
|
|
+ for_each_cpu(cpu) {
|
|
|
+ if (cpu == 0)
|
|
|
+ continue;
|
|
|
counter_base = COUNTER_BASE(oldcounters, nentries, cpu);
|
|
|
for (i = 0; i < nentries; i++) {
|
|
|
counters[i].pcnt += counter_base[i].pcnt;
|
|
@@ -929,7 +934,8 @@ static int do_replace(void __user *user, unsigned int len)
|
|
|
BUGPRINT("Entries_size never zero\n");
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
- countersize = COUNTER_OFFSET(tmp.nentries) * num_possible_cpus();
|
|
|
+ countersize = COUNTER_OFFSET(tmp.nentries) *
|
|
|
+ (highest_possible_processor_id()+1);
|
|
|
newinfo = (struct ebt_table_info *)
|
|
|
vmalloc(sizeof(struct ebt_table_info) + countersize);
|
|
|
if (!newinfo)
|
|
@@ -1022,7 +1028,7 @@ static int do_replace(void __user *user, unsigned int len)
|
|
|
|
|
|
vfree(table->entries);
|
|
|
if (table->chainstack) {
|
|
|
- for (i = 0; i < num_possible_cpus(); i++)
|
|
|
+ for_each_cpu(i)
|
|
|
vfree(table->chainstack[i]);
|
|
|
vfree(table->chainstack);
|
|
|
}
|
|
@@ -1040,7 +1046,7 @@ free_counterstmp:
|
|
|
vfree(counterstmp);
|
|
|
/* can be initialized in translate_table() */
|
|
|
if (newinfo->chainstack) {
|
|
|
- for (i = 0; i < num_possible_cpus(); i++)
|
|
|
+ for_each_cpu(i)
|
|
|
vfree(newinfo->chainstack[i]);
|
|
|
vfree(newinfo->chainstack);
|
|
|
}
|
|
@@ -1132,7 +1138,8 @@ int ebt_register_table(struct ebt_table *table)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- countersize = COUNTER_OFFSET(table->table->nentries) * num_possible_cpus();
|
|
|
+ countersize = COUNTER_OFFSET(table->table->nentries) *
|
|
|
+ (highest_possible_processor_id()+1);
|
|
|
newinfo = (struct ebt_table_info *)
|
|
|
vmalloc(sizeof(struct ebt_table_info) + countersize);
|
|
|
ret = -ENOMEM;
|
|
@@ -1186,7 +1193,7 @@ free_unlock:
|
|
|
up(&ebt_mutex);
|
|
|
free_chainstack:
|
|
|
if (newinfo->chainstack) {
|
|
|
- for (i = 0; i < num_possible_cpus(); i++)
|
|
|
+ for_each_cpu(i)
|
|
|
vfree(newinfo->chainstack[i]);
|
|
|
vfree(newinfo->chainstack);
|
|
|
}
|
|
@@ -1209,7 +1216,7 @@ void ebt_unregister_table(struct ebt_table *table)
|
|
|
up(&ebt_mutex);
|
|
|
vfree(table->private->entries);
|
|
|
if (table->private->chainstack) {
|
|
|
- for (i = 0; i < num_possible_cpus(); i++)
|
|
|
+ for_each_cpu(i)
|
|
|
vfree(table->private->chainstack[i]);
|
|
|
vfree(table->private->chainstack);
|
|
|
}
|