lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 8 Sep 2020 13:49:54 +0200
From:   Björn Töpel <bjorn.topel@...el.com>
To:     Eric Dumazet <eric.dumazet@...il.com>,
        Björn Töpel <bjorn.topel@...il.com>,
        ast@...nel.org, daniel@...earbox.net, netdev@...r.kernel.org,
        bpf@...r.kernel.org
Cc:     magnus.karlsson@...el.com, kuba@...nel.org,
        intel-wired-lan@...ts.osuosl.org
Subject: Re: [PATCH bpf-next 4/4] ixgbe, xsk: use XSK_NAPI_WEIGHT as NAPI poll
 budget

On 2020-09-08 11:45, Eric Dumazet wrote:
> 
> 
> On 9/7/20 5:02 PM, Björn Töpel wrote:
>> From: Björn Töpel <bjorn.topel@...el.com>
>>
>> Start using XSK_NAPI_WEIGHT as NAPI poll budget for the AF_XDP Rx
>> zero-copy path.
>>
>> Signed-off-by: Björn Töpel <bjorn.topel@...el.com>
>> ---
>>   drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
>> index 3771857cf887..f32c1ba0d237 100644
>> --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
>> +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c
>> @@ -239,7 +239,7 @@ int ixgbe_clean_rx_irq_zc(struct ixgbe_q_vector *q_vector,
>>   	bool failure = false;
>>   	struct sk_buff *skb;
>>   
>> -	while (likely(total_rx_packets < budget)) {
>> +	while (likely(total_rx_packets < XSK_NAPI_WEIGHT)) {
>>   		union ixgbe_adv_rx_desc *rx_desc;
>>   		struct ixgbe_rx_buffer *bi;
>>   		unsigned int size
> 
> This is a violation of NAPI API. IXGBE is already diverging a bit from best practices.
>

Thanks for having a look, Eric! By diverging from best practices, do
you mean that multiple queues share one NAPI context, and the budget
is split over the queues (say, 4 queues, 64/4 per queue), or that Tx
simply ignores the budget? Or both?

> There are reasons we want to control the budget from callers,
> if you want bigger budget just increase it instead of using your own ?
> 
> I would rather use a generic patch.
>

Hmm, so a configurable NAPI budget for, say, the AF_XDP enabled
queues/NAPIs? Am I reading that correct? (Note that this is *only* for
the AF_XDP enabled queues.)

I'll try to rework this to something more palatable.


Thanks,
Björn


> diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> index 7bd4fcdd0738a718d8b0f7134523cd87e4dcdb7b..33bcbdb6fef488983438c6584e3cbb0a44febb1a 100644
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -2311,11 +2311,14 @@ static inline void *netdev_priv(const struct net_device *dev)
>    */
>   #define SET_NETDEV_DEVTYPE(net, devtype)       ((net)->dev.type = (devtype))
>   
> -/* Default NAPI poll() weight
> - * Device drivers are strongly advised to not use bigger value
> - */
> +/* Default NAPI poll() weight. Highly recommended. */
>   #define NAPI_POLL_WEIGHT 64
>   
> +/* Device drivers are strongly advised to not use bigger value,
> + * as this might cause latencies in stress conditions.
> + */
> +#define NAPI_POLL_WEIGHT_MAX 256
> +
>   /**
>    *     netif_napi_add - initialize a NAPI context
>    *     @dev:  network device
> diff --git a/net/core/dev.c b/net/core/dev.c
> index 4086d335978c1bf62bd3965bd2ea96a4ac06b13d..496713fb6075bd8e5e22725e7c817172858e1dd7 100644
> --- a/net/core/dev.c
> +++ b/net/core/dev.c
> @@ -6608,7 +6608,7 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
>          INIT_LIST_HEAD(&napi->rx_list);
>          napi->rx_count = 0;
>          napi->poll = poll;
> -       if (weight > NAPI_POLL_WEIGHT)
> +       if (weight > NAPI_POLL_WEIGHT_MAX)
>                  netdev_err_once(dev, "%s() called with weight %d\n", __func__,
>                                  weight);
>          napi->weight = weight;
> 

Powered by blists - more mailing lists