|
@@ -283,15 +283,13 @@ static void trace_packet(const struct sk_buff *skb,
|
|
|
const struct xt_table_info *private,
|
|
|
const struct ip6t_entry *e)
|
|
|
{
|
|
|
- const void *table_base;
|
|
|
const struct ip6t_entry *root;
|
|
|
const char *hookname, *chainname, *comment;
|
|
|
const struct ip6t_entry *iter;
|
|
|
unsigned int rulenum = 0;
|
|
|
struct net *net = dev_net(in ? in : out);
|
|
|
|
|
|
- table_base = private->entries[smp_processor_id()];
|
|
|
- root = get_entry(table_base, private->hook_entry[hook]);
|
|
|
+ root = get_entry(private->entries, private->hook_entry[hook]);
|
|
|
|
|
|
hookname = chainname = hooknames[hook];
|
|
|
comment = comments[NF_IP6_TRACE_COMMENT_RULE];
|
|
@@ -357,7 +355,7 @@ ip6t_do_table(struct sk_buff *skb,
|
|
|
*/
|
|
|
smp_read_barrier_depends();
|
|
|
cpu = smp_processor_id();
|
|
|
- table_base = private->entries[cpu];
|
|
|
+ table_base = private->entries;
|
|
|
jumpstack = (struct ip6t_entry **)private->jumpstack[cpu];
|
|
|
stackptr = per_cpu_ptr(private->stackptr, cpu);
|
|
|
origptr = *stackptr;
|
|
@@ -890,12 +888,6 @@ translate_table(struct net *net, struct xt_table_info *newinfo, void *entry0,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- /* And one copy for every other CPU */
|
|
|
- for_each_possible_cpu(i) {
|
|
|
- if (newinfo->entries[i] && newinfo->entries[i] != entry0)
|
|
|
- memcpy(newinfo->entries[i], entry0, newinfo->size);
|
|
|
- }
|
|
|
-
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -911,7 +903,7 @@ get_counters(const struct xt_table_info *t,
|
|
|
seqcount_t *s = &per_cpu(xt_recseq, cpu);
|
|
|
|
|
|
i = 0;
|
|
|
- xt_entry_foreach(iter, t->entries[cpu], t->size) {
|
|
|
+ xt_entry_foreach(iter, t->entries, t->size) {
|
|
|
struct xt_counters *tmp;
|
|
|
u64 bcnt, pcnt;
|
|
|
unsigned int start;
|
|
@@ -959,17 +951,13 @@ copy_entries_to_user(unsigned int total_size,
|
|
|
struct xt_counters *counters;
|
|
|
const struct xt_table_info *private = table->private;
|
|
|
int ret = 0;
|
|
|
- const void *loc_cpu_entry;
|
|
|
+ void *loc_cpu_entry;
|
|
|
|
|
|
counters = alloc_counters(table);
|
|
|
if (IS_ERR(counters))
|
|
|
return PTR_ERR(counters);
|
|
|
|
|
|
- /* choose the copy that is on our node/cpu, ...
|
|
|
- * This choice is lazy (because current thread is
|
|
|
- * allowed to migrate to another cpu)
|
|
|
- */
|
|
|
- loc_cpu_entry = private->entries[raw_smp_processor_id()];
|
|
|
+ loc_cpu_entry = private->entries;
|
|
|
if (copy_to_user(userptr, loc_cpu_entry, total_size) != 0) {
|
|
|
ret = -EFAULT;
|
|
|
goto free_counters;
|
|
@@ -1083,10 +1071,10 @@ static int compat_table_info(const struct xt_table_info *info,
|
|
|
if (!newinfo || !info)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- /* we dont care about newinfo->entries[] */
|
|
|
+ /* we dont care about newinfo->entries */
|
|
|
memcpy(newinfo, info, offsetof(struct xt_table_info, entries));
|
|
|
newinfo->initial_entries = 0;
|
|
|
- loc_cpu_entry = info->entries[raw_smp_processor_id()];
|
|
|
+ loc_cpu_entry = info->entries;
|
|
|
xt_compat_init_offsets(AF_INET6, info->number);
|
|
|
xt_entry_foreach(iter, loc_cpu_entry, info->size) {
|
|
|
ret = compat_calc_entry(iter, info, loc_cpu_entry, newinfo);
|
|
@@ -1207,7 +1195,6 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,
|
|
|
struct xt_table *t;
|
|
|
struct xt_table_info *oldinfo;
|
|
|
struct xt_counters *counters;
|
|
|
- const void *loc_cpu_old_entry;
|
|
|
struct ip6t_entry *iter;
|
|
|
|
|
|
ret = 0;
|
|
@@ -1250,8 +1237,7 @@ __do_replace(struct net *net, const char *name, unsigned int valid_hooks,
|
|
|
get_counters(oldinfo, counters);
|
|
|
|
|
|
/* Decrease module usage counts and free resource */
|
|
|
- loc_cpu_old_entry = oldinfo->entries[raw_smp_processor_id()];
|
|
|
- xt_entry_foreach(iter, loc_cpu_old_entry, oldinfo->size)
|
|
|
+ xt_entry_foreach(iter, oldinfo->entries, oldinfo->size)
|
|
|
cleanup_entry(iter, net);
|
|
|
|
|
|
xt_free_table_info(oldinfo);
|
|
@@ -1297,8 +1283,7 @@ do_replace(struct net *net, const void __user *user, unsigned int len)
|
|
|
if (!newinfo)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- /* choose the copy that is on our node/cpu */
|
|
|
- loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
|
|
|
+ loc_cpu_entry = newinfo->entries;
|
|
|
if (copy_from_user(loc_cpu_entry, user + sizeof(tmp),
|
|
|
tmp.size) != 0) {
|
|
|
ret = -EFAULT;
|
|
@@ -1329,7 +1314,7 @@ static int
|
|
|
do_add_counters(struct net *net, const void __user *user, unsigned int len,
|
|
|
int compat)
|
|
|
{
|
|
|
- unsigned int i, curcpu;
|
|
|
+ unsigned int i;
|
|
|
struct xt_counters_info tmp;
|
|
|
struct xt_counters *paddc;
|
|
|
unsigned int num_counters;
|
|
@@ -1339,7 +1324,6 @@ do_add_counters(struct net *net, const void __user *user, unsigned int len,
|
|
|
struct xt_table *t;
|
|
|
const struct xt_table_info *private;
|
|
|
int ret = 0;
|
|
|
- const void *loc_cpu_entry;
|
|
|
struct ip6t_entry *iter;
|
|
|
unsigned int addend;
|
|
|
#ifdef CONFIG_COMPAT
|
|
@@ -1395,11 +1379,8 @@ do_add_counters(struct net *net, const void __user *user, unsigned int len,
|
|
|
}
|
|
|
|
|
|
i = 0;
|
|
|
- /* Choose the copy that is on our node */
|
|
|
- curcpu = smp_processor_id();
|
|
|
addend = xt_write_recseq_begin();
|
|
|
- loc_cpu_entry = private->entries[curcpu];
|
|
|
- xt_entry_foreach(iter, loc_cpu_entry, private->size) {
|
|
|
+ xt_entry_foreach(iter, private->entries, private->size) {
|
|
|
struct xt_counters *tmp;
|
|
|
|
|
|
tmp = xt_get_this_cpu_counter(&iter->counters);
|
|
@@ -1407,7 +1388,6 @@ do_add_counters(struct net *net, const void __user *user, unsigned int len,
|
|
|
++i;
|
|
|
}
|
|
|
xt_write_recseq_end(addend);
|
|
|
-
|
|
|
unlock_up_free:
|
|
|
local_bh_enable();
|
|
|
xt_table_unlock(t);
|
|
@@ -1750,7 +1730,7 @@ translate_compat_table(struct net *net,
|
|
|
newinfo->hook_entry[i] = info->hook_entry[i];
|
|
|
newinfo->underflow[i] = info->underflow[i];
|
|
|
}
|
|
|
- entry1 = newinfo->entries[raw_smp_processor_id()];
|
|
|
+ entry1 = newinfo->entries;
|
|
|
pos = entry1;
|
|
|
size = total_size;
|
|
|
xt_entry_foreach(iter0, entry0, total_size) {
|
|
@@ -1802,11 +1782,6 @@ translate_compat_table(struct net *net,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- /* And one copy for every other CPU */
|
|
|
- for_each_possible_cpu(i)
|
|
|
- if (newinfo->entries[i] && newinfo->entries[i] != entry1)
|
|
|
- memcpy(newinfo->entries[i], entry1, newinfo->size);
|
|
|
-
|
|
|
*pinfo = newinfo;
|
|
|
*pentry0 = entry1;
|
|
|
xt_free_table_info(info);
|
|
@@ -1853,8 +1828,7 @@ compat_do_replace(struct net *net, void __user *user, unsigned int len)
|
|
|
if (!newinfo)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- /* choose the copy that is on our node/cpu */
|
|
|
- loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
|
|
|
+ loc_cpu_entry = newinfo->entries;
|
|
|
if (copy_from_user(loc_cpu_entry, user + sizeof(tmp),
|
|
|
tmp.size) != 0) {
|
|
|
ret = -EFAULT;
|
|
@@ -1925,7 +1899,6 @@ compat_copy_entries_to_user(unsigned int total_size, struct xt_table *table,
|
|
|
void __user *pos;
|
|
|
unsigned int size;
|
|
|
int ret = 0;
|
|
|
- const void *loc_cpu_entry;
|
|
|
unsigned int i = 0;
|
|
|
struct ip6t_entry *iter;
|
|
|
|
|
@@ -1933,14 +1906,9 @@ compat_copy_entries_to_user(unsigned int total_size, struct xt_table *table,
|
|
|
if (IS_ERR(counters))
|
|
|
return PTR_ERR(counters);
|
|
|
|
|
|
- /* choose the copy that is on our node/cpu, ...
|
|
|
- * This choice is lazy (because current thread is
|
|
|
- * allowed to migrate to another cpu)
|
|
|
- */
|
|
|
- loc_cpu_entry = private->entries[raw_smp_processor_id()];
|
|
|
pos = userptr;
|
|
|
size = total_size;
|
|
|
- xt_entry_foreach(iter, loc_cpu_entry, total_size) {
|
|
|
+ xt_entry_foreach(iter, private->entries, total_size) {
|
|
|
ret = compat_copy_entry_to_user(iter, &pos,
|
|
|
&size, counters, i++);
|
|
|
if (ret != 0)
|
|
@@ -2115,8 +2083,7 @@ struct xt_table *ip6t_register_table(struct net *net,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- /* choose the copy on our node/cpu, but dont care about preemption */
|
|
|
- loc_cpu_entry = newinfo->entries[raw_smp_processor_id()];
|
|
|
+ loc_cpu_entry = newinfo->entries;
|
|
|
memcpy(loc_cpu_entry, repl->entries, repl->size);
|
|
|
|
|
|
ret = translate_table(net, newinfo, loc_cpu_entry, repl);
|
|
@@ -2146,7 +2113,7 @@ void ip6t_unregister_table(struct net *net, struct xt_table *table)
|
|
|
private = xt_unregister_table(table);
|
|
|
|
|
|
/* Decrease module usage counts and free resources */
|
|
|
- loc_cpu_entry = private->entries[raw_smp_processor_id()];
|
|
|
+ loc_cpu_entry = private->entries;
|
|
|
xt_entry_foreach(iter, loc_cpu_entry, private->size)
|
|
|
cleanup_entry(iter, net);
|
|
|
if (private->number > private->initial_entries)
|