[Devel] [PATCH rh7] netfilter: account x_tables to ub
Konstantin Khorenko
khorenko at virtuozzo.com
Thu May 28 09:11:58 PDT 2015
Andrey, please review.
--
Best regards,
Konstantin Khorenko,
Virtuozzo Linux Kernel Team
On 05/28/2015 05:43 PM, Vladimir Davydov wrote:
> This patch ports the code accounting netfilter/x_tables to ub
> (UB_NUMXTENT) from RH6.
>
> Related to https://jira.sw.ru/browse/PSBM-20089
>
> Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
> ---
> include/linux/netfilter/x_tables.h | 4 ++++
> net/netfilter/x_tables.c | 48 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 52 insertions(+)
>
> diff --git a/include/linux/netfilter/x_tables.h b/include/linux/netfilter/x_tables.h
> index 43c5f8d26880..22ee9b961ed9 100644
> --- a/include/linux/netfilter/x_tables.h
> +++ b/include/linux/netfilter/x_tables.h
> @@ -215,6 +215,10 @@ struct xt_table_info {
> unsigned int hook_entry[NF_INET_NUMHOOKS];
> unsigned int underflow[NF_INET_NUMHOOKS];
>
> +#ifdef CONFIG_BEANCOUNTERS
> + struct user_beancounter *ub;
> +#endif
> +
> /*
> * Number of user chains. Since tables cannot have loops, at most
> * @stacksize jumps (number of user chains) can possibly be made.
> diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
> index 919976f89644..3fa408656f17 100644
> --- a/net/netfilter/x_tables.c
> +++ b/net/netfilter/x_tables.c
> @@ -67,6 +67,43 @@ static const char *const xt_prefix[NFPROTO_NUMPROTO] = {
> [NFPROTO_IPV6] = "ip6",
> };
>
> +#ifdef CONFIG_BEANCOUNTERS
> +static void uncharge_xtables(struct xt_table_info *info, unsigned long size)
> +{
> + uncharge_beancounter(info->ub, UB_NUMXTENT, size);
> +}
> +
> +static int recharge_xtables(struct xt_table_info *new, struct xt_table_info *old)
> +{
> + struct user_beancounter *ub, *old_ub;
> + long change;
> +
> + ub = new->ub;
> + old_ub = old->number ? old->ub : ub;
> + change = (long)new->number - (long)old->number;
> + if (old_ub != ub) {
> + printk(KERN_WARNING "iptables resources are charged"
> + " from different UB (%s -> %s)\n",
> + old_ub->ub_name, ub->ub_name);
> + change = new->number;
> + }
> +
> + if (change > 0) {
> + if (charge_beancounter(ub, UB_NUMXTENT, change, UB_SOFT))
> + return -ENOMEM;
> + } else if (change < 0)
> + uncharge_beancounter(ub, UB_NUMXTENT, -change);
> +
> + if (old_ub != ub)
> + uncharge_beancounter(old_ub, UB_NUMXTENT, old->number);
> +
> + return 0;
> +}
> +#else
> +#define recharge_xtables(c, new, old) (0)
> +#define uncharge_xtables(info, s) do { } while (0)
> +#endif /* CONFIG_BEANCOUNTERS */
> +
> /* Allow this many total (re)entries. */
> static const unsigned int xt_jumpstack_multiplier = 2;
>
> @@ -732,6 +769,8 @@ struct xt_table_info *xt_alloc_table_info(unsigned int size)
> }
> }
>
> + newinfo->ub = get_beancounter(get_exec_ub());
> +
> return newinfo;
> }
> EXPORT_SYMBOL(xt_alloc_table_info);
> @@ -764,6 +803,8 @@ void xt_free_table_info(struct xt_table_info *info)
>
> free_percpu(info->stackptr);
>
> + put_beancounter(info->ub);
> +
> kfree(info);
> }
> EXPORT_SYMBOL(xt_free_table_info);
> @@ -874,6 +915,12 @@ xt_replace_table(struct xt_table *table,
> return NULL;
> }
>
> + if (recharge_xtables(newinfo, private)) {
> + local_bh_enable();
> + *error = -ENOMEM;
> + return NULL;
> + }
> +
> newinfo->initial_entries = private->initial_entries;
> /*
> * Ensure contents of newinfo are visible before assigning to
> @@ -971,6 +1018,7 @@ void *xt_unregister_table(struct xt_table *table)
> list_del(&table->list);
> mutex_unlock(&xt[table->af].mutex);
> kfree(table);
> + uncharge_xtables(private, private->number);
>
> return private;
> }
>
More information about the Devel
mailing list