2022-11-10 10:15:17

by Daniel Machon

[permalink] [raw]
Subject: [PATCH net-next] net: dcb: move getapptrust to separate function

This patch fixes a frame size warning, reported by kernel test robot.

>> net/dcb/dcbnl.c:1230:1: warning: the frame size of 1244 bytes is
>> larger than 1024 bytes [-Wframe-larger-than=]

The getapptrust part of dcbnl_ieee_fill is moved to a separate function,
and the selector array is now dynamically allocated, instead of stack
allocated.

Tested on microchip sparx5 driver.

Fixes: 6182d5875c33 ("net: dcb: add new apptrust attribute")
Reported-by: kernel test robot <[email protected]>
Signed-off-by: Daniel Machon <[email protected]>
---
net/dcb/dcbnl.c | 67 +++++++++++++++++++++++++++++++++----------------
1 file changed, 45 insertions(+), 22 deletions(-)

diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
index cec0632f96db..3f4d88c1ec78 100644
--- a/net/dcb/dcbnl.c
+++ b/net/dcb/dcbnl.c
@@ -1060,11 +1060,52 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb,
return err;
}

+static int dcbnl_getapptrust(struct net_device *netdev, struct sk_buff *skb)
+{
+ const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
+ int nselectors, err;
+ u8 *selectors;
+
+ selectors = kzalloc(IEEE_8021QAZ_APP_SEL_MAX + 1, GFP_KERNEL);
+ if (!selectors)
+ return -ENOMEM;
+
+ err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
+
+ if (!err) {
+ struct nlattr *apptrust;
+ int i;
+
+ err = -EMSGSIZE;
+
+ apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
+ if (!apptrust)
+ goto nla_put_failure;
+
+ for (i = 0; i < nselectors; i++) {
+ enum ieee_attrs_app type =
+ dcbnl_app_attr_type_get(selectors[i]);
+ err = nla_put_u8(skb, type, selectors[i]);
+ if (err) {
+ nla_nest_cancel(skb, apptrust);
+ goto nla_put_failure;
+ }
+ }
+ nla_nest_end(skb, apptrust);
+ }
+
+ err = 0;
+
+nla_put_failure:
+ kfree(selectors);
+ return err;
+}
+
/* Handle IEEE 802.1Qaz/802.1Qau/802.1Qbb GET commands. */
static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
{
const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
- struct nlattr *ieee, *app, *apptrust;
+ struct nlattr *ieee, *app;
struct dcb_app_type *itr;
int dcbx;
int err;
@@ -1168,27 +1209,9 @@ static int dcbnl_ieee_fill(struct sk_buff *skb, struct net_device *netdev)
nla_nest_end(skb, app);

if (ops->dcbnl_getapptrust) {
- u8 selectors[IEEE_8021QAZ_APP_SEL_MAX + 1] = {0};
- int nselectors, i;
-
- apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
- if (!apptrust)
- return -EMSGSIZE;
-
- err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
- if (!err) {
- for (i = 0; i < nselectors; i++) {
- enum ieee_attrs_app type =
- dcbnl_app_attr_type_get(selectors[i]);
- err = nla_put_u8(skb, type, selectors[i]);
- if (err) {
- nla_nest_cancel(skb, apptrust);
- return err;
- }
- }
- }
-
- nla_nest_end(skb, apptrust);
+ err = dcbnl_getapptrust(netdev, skb);
+ if (err)
+ return err;
}

/* get peer info if available */
--
2.34.1



2022-11-10 17:41:02

by Petr Machata

[permalink] [raw]
Subject: Re: [PATCH net-next] net: dcb: move getapptrust to separate function


Daniel Machon <[email protected]> writes:

> diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
> index cec0632f96db..3f4d88c1ec78 100644
> --- a/net/dcb/dcbnl.c
> +++ b/net/dcb/dcbnl.c
> @@ -1060,11 +1060,52 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb,
> return err;
> }
>
> +static int dcbnl_getapptrust(struct net_device *netdev, struct sk_buff *skb)
> +{
> + const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
> + int nselectors, err;
> + u8 *selectors;
> +
> + selectors = kzalloc(IEEE_8021QAZ_APP_SEL_MAX + 1, GFP_KERNEL);
> + if (!selectors)
> + return -ENOMEM;
> +
> + err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
> +
> + if (!err) {
> + struct nlattr *apptrust;
> + int i;

(Maybe consider moving these up to the function scope. This scope
business made sense in the generic function, IMHO is not as useful with
a focused function like this one.)

> +
> + err = -EMSGSIZE;
> +
> + apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
> + if (!apptrust)
> + goto nla_put_failure;
> +
> + for (i = 0; i < nselectors; i++) {
> + enum ieee_attrs_app type =
> + dcbnl_app_attr_type_get(selectors[i]);

Doesn't checkpatch warn about this? There should be a blank line after
the variable declaration block. (Even if there wasn't one there in the
original code either.)

> + err = nla_put_u8(skb, type, selectors[i]);
> + if (err) {
> + nla_nest_cancel(skb, apptrust);
> + goto nla_put_failure;
> + }
> + }
> + nla_nest_end(skb, apptrust);
> + }
> +
> + err = 0;
> +
> +nla_put_failure:
> + kfree(selectors);
> + return err;
> +}
> +

2022-11-11 07:04:42

by Daniel Machon

[permalink] [raw]
Subject: Re: [PATCH net-next] net: dcb: move getapptrust to separate function

Den Thu, Nov 10, 2022 at 05:30:43PM +0100 skrev Petr Machata:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
>
> Daniel Machon <[email protected]> writes:
>
> > diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
> > index cec0632f96db..3f4d88c1ec78 100644
> > --- a/net/dcb/dcbnl.c
> > +++ b/net/dcb/dcbnl.c
> > @@ -1060,11 +1060,52 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb,
> > return err;
> > }
> >
> > +static int dcbnl_getapptrust(struct net_device *netdev, struct sk_buff *skb)
> > +{
> > + const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
> > + int nselectors, err;
> > + u8 *selectors;
> > +
> > + selectors = kzalloc(IEEE_8021QAZ_APP_SEL_MAX + 1, GFP_KERNEL);
> > + if (!selectors)
> > + return -ENOMEM;
> > +
> > + err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
> > +
> > + if (!err) {
> > + struct nlattr *apptrust;
> > + int i;
>
> (Maybe consider moving these up to the function scope. This scope
> business made sense in the generic function, IMHO is not as useful with
> a focused function like this one.)

I dont mind doing that, however, this 'scope business' is just staying true
to the rest of the dcbnl code :-) - that said, I think I agree with your
point.

>
> > +
> > + err = -EMSGSIZE;
> > +
> > + apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
> > + if (!apptrust)
> > + goto nla_put_failure;
> > +
> > + for (i = 0; i < nselectors; i++) {
> > + enum ieee_attrs_app type =
> > + dcbnl_app_attr_type_get(selectors[i]);
>
> Doesn't checkpatch warn about this? There should be a blank line after
> the variable declaration block. (Even if there wasn't one there in the
> original code either.)

Nope, no warning. And I think it has something to do with the way the line
is split.

>
> > + err = nla_put_u8(skb, type, selectors[i]);
> > + if (err) {
> > + nla_nest_cancel(skb, apptrust);
> > + goto nla_put_failure;
> > + }
> > + }
> > + nla_nest_end(skb, apptrust);
> > + }
> > +
> > + err = 0;
> > +
> > +nla_put_failure:
> > + kfree(selectors);
> > + return err;
> > +}
> > +

2022-11-11 11:37:04

by Petr Machata

[permalink] [raw]
Subject: Re: [PATCH net-next] net: dcb: move getapptrust to separate function


<[email protected]> writes:

> Den Thu, Nov 10, 2022 at 05:30:43PM +0100 skrev Petr Machata:
>> EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
>>
>> Daniel Machon <[email protected]> writes:
>>
>> > diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
>> > index cec0632f96db..3f4d88c1ec78 100644
>> > --- a/net/dcb/dcbnl.c
>> > +++ b/net/dcb/dcbnl.c
>> > @@ -1060,11 +1060,52 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb,
>> > return err;
>> > }
>> >
>> > +static int dcbnl_getapptrust(struct net_device *netdev, struct sk_buff *skb)
>> > +{
>> > + const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
>> > + int nselectors, err;
>> > + u8 *selectors;
>> > +
>> > + selectors = kzalloc(IEEE_8021QAZ_APP_SEL_MAX + 1, GFP_KERNEL);
>> > + if (!selectors)
>> > + return -ENOMEM;
>> > +
>> > + err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
>> > +
>> > + if (!err) {
>> > + struct nlattr *apptrust;
>> > + int i;
>>
>> (Maybe consider moving these up to the function scope. This scope
>> business made sense in the generic function, IMHO is not as useful with
>> a focused function like this one.)
>
> I dont mind doing that, however, this 'scope business' is just staying true
> to the rest of the dcbnl code :-) - that said, I think I agree with your
> point.
>
>>
>> > +
>> > + err = -EMSGSIZE;
>> > +
>> > + apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
>> > + if (!apptrust)
>> > + goto nla_put_failure;
>> > +
>> > + for (i = 0; i < nselectors; i++) {
>> > + enum ieee_attrs_app type =
>> > + dcbnl_app_attr_type_get(selectors[i]);
>>
>> Doesn't checkpatch warn about this? There should be a blank line after
>> the variable declaration block. (Even if there wasn't one there in the
>> original code either.)
>
> Nope, no warning. And I think it has something to do with the way the line
> is split.

OK. I find the code readable just fine, so I'm fine with it as it
stands:

Reviewed-by: Petr Machata <[email protected]>

2022-11-11 13:33:52

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH net-next] net: dcb: move getapptrust to separate function

On Fri, 2022-11-11 at 06:45 +0000, [email protected] wrote:
> Den Thu, Nov 10, 2022 at 05:30:43PM +0100 skrev Petr Machata:
> > EXTERNAL EMAIL: Do not click links or open attachments unless you know the content is safe
> >
> > Daniel Machon <[email protected]> writes:
> >
> > > diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
> > > index cec0632f96db..3f4d88c1ec78 100644
> > > --- a/net/dcb/dcbnl.c
> > > +++ b/net/dcb/dcbnl.c
> > > @@ -1060,11 +1060,52 @@ static int dcbnl_build_peer_app(struct net_device *netdev, struct sk_buff* skb,
> > > return err;
> > > }
> > >
> > > +static int dcbnl_getapptrust(struct net_device *netdev, struct sk_buff *skb)
> > > +{
> > > + const struct dcbnl_rtnl_ops *ops = netdev->dcbnl_ops;
> > > + int nselectors, err;
> > > + u8 *selectors;
> > > +
> > > + selectors = kzalloc(IEEE_8021QAZ_APP_SEL_MAX + 1, GFP_KERNEL);
> > > + if (!selectors)
> > > + return -ENOMEM;
> > > +
> > > + err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
> > > +
> > > + if (!err) {
> > > + struct nlattr *apptrust;
> > > + int i;
> >
> > (Maybe consider moving these up to the function scope. This scope
> > business made sense in the generic function, IMHO is not as useful with
> > a focused function like this one.)
>
> I dont mind doing that, however, this 'scope business' is just staying true
> to the rest of the dcbnl code :-) - that said, I think I agree with your
> point.
>
> >
> > > +
> > > + err = -EMSGSIZE;
> > > +
> > > + apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
> > > + if (!apptrust)
> > > + goto nla_put_failure;
> > > +
> > > + for (i = 0; i < nselectors; i++) {
> > > + enum ieee_attrs_app type =
> > > + dcbnl_app_attr_type_get(selectors[i]);
> >
> > Doesn't checkpatch warn about this? There should be a blank line after
> > the variable declaration block. (Even if there wasn't one there in the
> > original code either.)
>
> Nope, no warning. And I think it has something to do with the way the line
> is split.

yup.

And style trivia:

I suggest adding error types after specific errors,
reversing the test and unindenting the code too.

Something like:

err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
if (err) {
err = 0;
goto out;
}

apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
if (!apptrust) {
err = -EMSGSIZE;
goto out;
}

for (i = 0; i < nselectors; i++) {
enum ieee_attrs_app type = dcbnl_app_attr_type_get(selectors[i]);
err = nla_put_u8(skb, type, selectors[i]);
if (err) {
nla_nest_cancel(skb, apptrust);
goto out;
}
}
nla_nest_end(skb, apptrust);

err = 0;

out:
kfree(selectors);
return err;
}


2022-11-14 09:46:28

by Daniel Machon

[permalink] [raw]
Subject: Re: [PATCH net-next] net: dcb: move getapptrust to separate function

> > > > +
> > > > + err = -EMSGSIZE;
> > > > +
> > > > + apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
> > > > + if (!apptrust)
> > > > + goto nla_put_failure;
> > > > +
> > > > + for (i = 0; i < nselectors; i++) {
> > > > + enum ieee_attrs_app type =
> > > > + dcbnl_app_attr_type_get(selectors[i]);
> > >
> > > Doesn't checkpatch warn about this? There should be a blank line after
> > > the variable declaration block. (Even if there wasn't one there in the
> > > original code either.)
> >
> > Nope, no warning. And I think it has something to do with the way the line
> > is split.
>
> yup.
>
> And style trivia:
>
> I suggest adding error types after specific errors,
> reversing the test and unindenting the code too.
>
> Something like:
>
> err = ops->dcbnl_getapptrust(netdev, selectors, &nselectors);
> if (err) {
> err = 0;
> goto out;
> }
>
> apptrust = nla_nest_start(skb, DCB_ATTR_DCB_APP_TRUST_TABLE);
> if (!apptrust) {
> err = -EMSGSIZE;
> goto out;
> }
>
> for (i = 0; i < nselectors; i++) {
> enum ieee_attrs_app type = dcbnl_app_attr_type_get(selectors[i]);
> err = nla_put_u8(skb, type, selectors[i]);
> if (err) {
> nla_nest_cancel(skb, apptrust);
> goto out;
> }
> }
> nla_nest_end(skb, apptrust);
>
> err = 0;
>
> out:
> kfree(selectors);
> return err;
> }
>

LGTM.

The last err = 0 can even be removed, as I see it.
Will submit a new version with the changes suggested.

/ Daniel