All of lore.kernel.org
 help / color / mirror / Atom feed
From: Denis Kirjanov <dkirjanov@suse.de>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>,
	Arnd Bergmann <arnd@kernel.org>
Cc: Jamal Hadi Salim <jhs@mojatatu.com>,
	Cong Wang <xiyou.wangcong@gmail.com>,
	Jiri Pirko <jiri@resnulli.us>,
	"David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>,
	"Ahmed S. Darwish" <a.darwish@linutronix.de>,
	Arnd Bergmann <arnd@arndb.de>,
	Zheng Yongjun <zhengyongjun3@huawei.com>,
	Eric Dumazet <edumazet@google.com>,
	Randy Dunlap <rdunlap@infradead.org>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH net-next v3] net: sched: gred: dynamically allocate tc_gred_qopt_offload
Date: Tue, 26 Oct 2021 13:42:24 +0300	[thread overview]
Message-ID: <3bf1e148-14fc-98f6-5319-78046a7b9565@suse.de> (raw)
In-Reply-To: <20211026100711.nalhttf6mbe6sudx@linutronix.de>



10/26/21 1:07 PM, Sebastian Andrzej Siewior пишет:
> From: Arnd Bergmann <arnd@arndb.de>
> 
> The tc_gred_qopt_offload structure has grown too big to be on the
> stack for 32-bit architectures after recent changes.
> 
> net/sched/sch_gred.c:903:13: error: stack frame size (1180) exceeds limit (1024) in 'gred_destroy' [-Werror,-Wframe-larger-than]
> net/sched/sch_gred.c:310:13: error: stack frame size (1212) exceeds limit (1024) in 'gred_offload' [-Werror,-Wframe-larger-than]
> 
> Use dynamic allocation per qdisc to avoid this.
> 
> Fixes: 50dc9a8572aa ("net: sched: Merge Qdisc::bstats and Qdisc::cpu_bstats data types")
> Fixes: 67c9e6270f30 ("net: sched: Protect Qdisc::bstats with u64_stats")
> Suggested-by: Jakub Kicinski <kuba@kernel.org>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
> v2…v3:
>   - drop not needed return statement in gred_offload() (Jakub)
>   - use kzalloc(sizeof(*table->opt) in gred_init() (Eric)
>   - Make the allocation conditional on ->ndo_setup_tc (Jakub).
> 
>   net/sched/sch_gred.c | 50 ++++++++++++++++++++++++++------------------
>   1 file changed, 30 insertions(+), 20 deletions(-)
> 
> diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c
> index 72de08ef8335e..1073c76d05c45 100644
> --- a/net/sched/sch_gred.c
> +++ b/net/sched/sch_gred.c
> @@ -56,6 +56,7 @@ struct gred_sched {
>   	u32 		DPs;
>   	u32 		def;
>   	struct red_vars wred_set;
> +	struct tc_gred_qopt_offload *opt;
>   };
>   
>   static inline int gred_wred_mode(struct gred_sched *table)
> @@ -311,42 +312,43 @@ static void gred_offload(struct Qdisc *sch, enum tc_gred_command command)
>   {
>   	struct gred_sched *table = qdisc_priv(sch);
>   	struct net_device *dev = qdisc_dev(sch);
> -	struct tc_gred_qopt_offload opt = {
> -		.command	= command,
> -		.handle		= sch->handle,
> -		.parent		= sch->parent,
> -	};
> +	struct tc_gred_qopt_offload *opt = table->opt;
>   
>   	if (!tc_can_offload(dev) || !dev->netdev_ops->ndo_setup_tc)
>   		return;
>   
> +	memset(opt, 0, sizeof(*opt));

It's zeroed in kzalloc()

> +	opt->command = command;
> +	opt->handle = sch->handle;
> +	opt->parent = sch->parent;
> +
>   	if (command == TC_GRED_REPLACE) {
>   		unsigned int i;
>   
> -		opt.set.grio_on = gred_rio_mode(table);
> -		opt.set.wred_on = gred_wred_mode(table);
> -		opt.set.dp_cnt = table->DPs;
> -		opt.set.dp_def = table->def;
> +		opt->set.grio_on = gred_rio_mode(table);
> +		opt->set.wred_on = gred_wred_mode(table);
> +		opt->set.dp_cnt = table->DPs;
> +		opt->set.dp_def = table->def;
>   
>   		for (i = 0; i < table->DPs; i++) {
>   			struct gred_sched_data *q = table->tab[i];
>   
>   			if (!q)
>   				continue;
> -			opt.set.tab[i].present = true;
> -			opt.set.tab[i].limit = q->limit;
> -			opt.set.tab[i].prio = q->prio;
> -			opt.set.tab[i].min = q->parms.qth_min >> q->parms.Wlog;
> -			opt.set.tab[i].max = q->parms.qth_max >> q->parms.Wlog;
> -			opt.set.tab[i].is_ecn = gred_use_ecn(q);
> -			opt.set.tab[i].is_harddrop = gred_use_harddrop(q);
> -			opt.set.tab[i].probability = q->parms.max_P;
> -			opt.set.tab[i].backlog = &q->backlog;
> +			opt->set.tab[i].present = true;
> +			opt->set.tab[i].limit = q->limit;
> +			opt->set.tab[i].prio = q->prio;
> +			opt->set.tab[i].min = q->parms.qth_min >> q->parms.Wlog;
> +			opt->set.tab[i].max = q->parms.qth_max >> q->parms.Wlog;
> +			opt->set.tab[i].is_ecn = gred_use_ecn(q);
> +			opt->set.tab[i].is_harddrop = gred_use_harddrop(q);
> +			opt->set.tab[i].probability = q->parms.max_P;
> +			opt->set.tab[i].backlog = &q->backlog;
>   		}
> -		opt.set.qstats = &sch->qstats;
> +		opt->set.qstats = &sch->qstats;
>   	}
>   
> -	dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_GRED, &opt);
> +	dev->netdev_ops->ndo_setup_tc(dev, TC_SETUP_QDISC_GRED, opt);
>   }
>   
>   static int gred_offload_dump_stats(struct Qdisc *sch)
> @@ -731,6 +733,7 @@ static int gred_change(struct Qdisc *sch, struct nlattr *opt,
>   static int gred_init(struct Qdisc *sch, struct nlattr *opt,
>   		     struct netlink_ext_ack *extack)
>   {
> +	struct gred_sched *table = qdisc_priv(sch);
>   	struct nlattr *tb[TCA_GRED_MAX + 1];
>   	int err;
>   
> @@ -754,6 +757,12 @@ static int gred_init(struct Qdisc *sch, struct nlattr *opt,
>   		sch->limit = qdisc_dev(sch)->tx_queue_len
>   		             * psched_mtu(qdisc_dev(sch));
>   
> +	if (qdisc_dev(sch)->netdev_ops->ndo_setup_tc) {
> +		table->opt = kzalloc(sizeof(*table->opt), GFP_KERNEL);
> +		if (!table->opt)
> +			return -ENOMEM;
> +	}
> +
>   	return gred_change_table_def(sch, tb[TCA_GRED_DPS], extack);
>   }
>   
> @@ -910,6 +919,7 @@ static void gred_destroy(struct Qdisc *sch)
>   			gred_destroy_vq(table->tab[i]);
>   	}
>   	gred_offload(sch, TC_GRED_DESTROY);
> +	kfree(table->opt);
>   }
>   
>   static struct Qdisc_ops gred_qdisc_ops __read_mostly = {
> 

  reply	other threads:[~2021-10-26 10:42 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-26 10:07 [PATCH net-next v3] net: sched: gred: dynamically allocate tc_gred_qopt_offload Sebastian Andrzej Siewior
2021-10-26 10:42 ` Denis Kirjanov [this message]
2021-10-26 10:51   ` Sebastian Andrzej Siewior
2021-10-26 11:16     ` Denis Kirjanov
2021-10-26 11:43       ` Sebastian Andrzej Siewior
2021-10-27 19:20 ` patchwork-bot+netdevbpf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3bf1e148-14fc-98f6-5319-78046a7b9565@suse.de \
    --to=dkirjanov@suse.de \
    --cc=a.darwish@linutronix.de \
    --cc=arnd@arndb.de \
    --cc=arnd@kernel.org \
    --cc=bigeasy@linutronix.de \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=jhs@mojatatu.com \
    --cc=jiri@resnulli.us \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=rdunlap@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=xiyou.wangcong@gmail.com \
    --cc=zhengyongjun3@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.