On 16-06-07 03:46 AM, Jakub Kicinski wrote:
> Return an error if user requested skip-sw and the underlaying
> hardware cannot handle tc offloads (or offloads are disabled).
> 
> Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com>
> Reviewed-by: Dinan Gunawardena <dgunaward...@netronome.com>
> Reviewed-by: Simon Horman <simon.hor...@netronome.com>
> ---
> v2:
>   - handle both knode and hnodes
> ---
>  net/sched/cls_u32.c | 58 
> +++++++++++++++++++++++++++--------------------------
>  1 file changed, 30 insertions(+), 28 deletions(-)
> 
> diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
> index b17e090f2fe1..0fc1d47885f8 100644
> --- a/net/sched/cls_u32.c
> +++ b/net/sched/cls_u32.c
> @@ -457,20 +457,21 @@ static int u32_replace_hw_hnode(struct tcf_proto *tp,
>       struct tc_to_netdev offload;
>       int err;
>  
> +     if (!tc_should_offload(dev, flags))
> +             return tc_skip_sw(flags) ? -EINVAL : 0;
> +
>       offload.type = TC_SETUP_CLSU32;
>       offload.cls_u32 = &u32_offload;
>  
> -     if (tc_should_offload(dev, flags)) {
> -             offload.cls_u32->command = TC_CLSU32_NEW_HNODE;
> -             offload.cls_u32->hnode.divisor = h->divisor;
> -             offload.cls_u32->hnode.handle = h->handle;
> -             offload.cls_u32->hnode.prio = h->prio;
> +     offload.cls_u32->command = TC_CLSU32_NEW_HNODE;
> +     offload.cls_u32->hnode.divisor = h->divisor;
> +     offload.cls_u32->hnode.handle = h->handle;
> +     offload.cls_u32->hnode.prio = h->prio;
>  
> -             err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
> -                                                 tp->protocol, &offload);
> -             if (tc_skip_sw(flags))
> -                     return err;
> -     }
> +     err = dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle,
> +                                         tp->protocol, &offload);
> +     if (tc_skip_sw(flags))
> +             return err;
>  
>       return 0;
>  }

Looks like we also need to catch the error at u32_replace_hw_hnode call
sites?


                u32_replace_hw_hnode(tp, ht, flags);
                return 0;
        }

should be

                return replace_hw_hnode(tp, ht,flags)


Thanks,
John

Reply via email to