CC: [email protected]
BCC: [email protected]
In-Reply-To: <[email protected]>
References: <[email protected]>
TO: Dimitris Michailidis <[email protected]>
TO: [email protected]
TO: [email protected]
TO: [email protected]
TO: [email protected]
TO: [email protected]

Hi Dimitris,

I love your patch! Yet something to improve:

[auto build test ERROR on net-next/master]

url:    
https://github.com/0day-ci/linux/commits/Dimitris-Michailidis/new-Fungible-Ethernet-driver/20220220-185154
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 
129c77b5692d4a95a00aa7d58075afe77179623e
:::::: branch date: 4 days ago
:::::: commit date: 4 days ago
config: s390-randconfig-p002-20220223 
(https://download.01.org/0day-ci/archive/20220224/[email protected]/config)
compiler: s390-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # 
https://github.com/0day-ci/linux/commit/165b382a06823cbcbe98671f6442cb3286c6924b
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review 
Dimitris-Michailidis/new-Fungible-Ethernet-driver/20220220-185154
        git checkout 165b382a06823cbcbe98671f6442cb3286c6924b
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross 
O=build_dir ARCH=s390 SHELL=/bin/bash drivers/net/ethernet/fungible/funeth/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

All error/warnings (new ones prefixed by >>):

   drivers/net/ethernet/fungible/funeth/funeth_tx.c: In function 
'write_pkt_desc':
>> drivers/net/ethernet/fungible/funeth/funeth_tx.c:252:27: error: implicit 
>> declaration of function 'tls_driver_ctx' 
>> [-Werror=implicit-function-declaration]
     252 |                 tls_ctx = tls_driver_ctx(skb->sk, 
TLS_OFFLOAD_CTX_DIR_TX);
         |                           ^~~~~~~~~~~~~~
>> drivers/net/ethernet/fungible/funeth/funeth_tx.c:252:51: error: 
>> 'TLS_OFFLOAD_CTX_DIR_TX' undeclared (first use in this function)
     252 |                 tls_ctx = tls_driver_ctx(skb->sk, 
TLS_OFFLOAD_CTX_DIR_TX);
         |                                                   
^~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/fungible/funeth/funeth_tx.c:252:51: note: each 
undeclared identifier is reported only once for each function it appears in
>> drivers/net/ethernet/fungible/funeth/funeth_tx.c:253:37: error: invalid use 
>> of undefined type 'struct fun_ktls_tx_ctx'
     253 |                 tls->tlsid = tls_ctx->tlsid;
         |                                     ^~
   drivers/net/ethernet/fungible/funeth/funeth_tx.c:254:24: error: invalid use 
of undefined type 'struct fun_ktls_tx_ctx'
     254 |                 tls_ctx->next_seq += tls_len;
         |                        ^~
   drivers/net/ethernet/fungible/funeth/funeth_tx.c: In function 
'fun_start_xmit':
>> drivers/net/ethernet/fungible/funeth/funeth_tx.c:318:13: error: implicit 
>> declaration of function 'tls_is_sk_tx_device_offloaded' 
>> [-Werror=implicit-function-declaration]
     318 |             tls_is_sk_tx_device_offloaded(skb->sk)) {
         |             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/fungible/funeth/funeth_tx.c:319:23: error: implicit 
>> declaration of function 'fun_tls_tx'; did you mean 'fun_xdp_tx'? 
>> [-Werror=implicit-function-declaration]
     319 |                 skb = fun_tls_tx(skb, q, &tls_len);
         |                       ^~~~~~~~~~
         |                       fun_xdp_tx
>> drivers/net/ethernet/fungible/funeth/funeth_tx.c:319:21: warning: assignment 
>> to 'struct sk_buff *' from 'int' makes pointer from integer without a cast 
>> [-Wint-conversion]
     319 |                 skb = fun_tls_tx(skb, q, &tls_len);
         |                     ^
   cc1: some warnings being treated as errors


vim +/tls_driver_ctx +252 drivers/net/ethernet/fungible/funeth/funeth_tx.c

2458c35a3a5d46 Dimitris Michailidis 2022-02-18  116  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  117  /* Write as many 
descriptors as needed for the supplied skb starting at the
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  118   * current producer 
location. The caller has made certain enough descriptors
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  119   * are available.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  120   *
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  121   * Returns the number of 
descriptors written, 0 on error.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  122   */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  123  static unsigned int 
write_pkt_desc(struct sk_buff *skb, struct funeth_txq *q,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  124                             
   unsigned int tls_len)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  125  {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  126     unsigned int 
extra_bytes = 0, extra_pkts = 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  127     unsigned int idx = 
q->prod_cnt & q->mask;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  128     const struct 
skb_shared_info *shinfo;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  129     unsigned int 
lens[MAX_SKB_FRAGS + 1];
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  130     dma_addr_t 
addrs[MAX_SKB_FRAGS + 1];
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  131     struct fun_eth_tx_req 
*req;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  132     struct fun_dataop_gl 
*gle;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  133     const struct tcphdr *th;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  134     unsigned int ngle, i;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  135     u16 flags;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  136  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  137     if (unlikely(skb->len < 
FUN_TX_MIN_LEN)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  138             
FUN_QSTAT_INC(q, tx_len_err);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  139             return 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  140     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  141  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  142     if 
(unlikely(map_skb(skb, q->dma_dev, addrs, lens))) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  143             
FUN_QSTAT_INC(q, tx_map_err);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  144             return 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  145     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  146  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  147     req = 
fun_tx_desc_addr(q, idx);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  148     req->op = FUN_ETH_OP_TX;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  149     req->len8 = 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  150     req->flags = 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  151     req->suboff8 = 
offsetof(struct fun_eth_tx_req, dataop);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  152     req->repr_idn = 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  153     req->encap_proto = 0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  154  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  155     shinfo = 
skb_shinfo(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  156     if 
(likely(shinfo->gso_size)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  157             if 
(skb->encapsulation) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  158                     u16 
ol4_ofst;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  159  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  160                     flags = 
FUN_ETH_OUTER_EN | FUN_ETH_INNER_LSO |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  161                             
FUN_ETH_UPDATE_INNER_L4_CKSUM |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  162                             
FUN_ETH_UPDATE_OUTER_L3_LEN;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  163                     if 
(shinfo->gso_type & (SKB_GSO_UDP_TUNNEL |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  164                             
                SKB_GSO_UDP_TUNNEL_CSUM)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  165                             
flags |= FUN_ETH_UPDATE_OUTER_L4_LEN |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  166                             
         FUN_ETH_OUTER_UDP;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  167                             
if (shinfo->gso_type & SKB_GSO_UDP_TUNNEL_CSUM)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  168                             
        flags |= FUN_ETH_UPDATE_OUTER_L4_CKSUM;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  169                             
ol4_ofst = skb_transport_offset(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  170                     } else {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  171                             
ol4_ofst = skb_inner_network_offset(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  172                     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  173  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  174                     if 
(ip_hdr(skb)->version == 4)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  175                             
flags |= FUN_ETH_UPDATE_OUTER_L3_CKSUM;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  176                     else
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  177                             
flags |= FUN_ETH_OUTER_IPV6;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  178  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  179                     if 
(skb->inner_network_header) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  180                             
if (inner_ip_hdr(skb)->version == 4)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  181                             
        flags |= FUN_ETH_UPDATE_INNER_L3_CKSUM |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  182                             
                 FUN_ETH_UPDATE_INNER_L3_LEN;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  183                             
else
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  184                             
        flags |= FUN_ETH_INNER_IPV6 |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  185                             
                 FUN_ETH_UPDATE_INNER_L3_LEN;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  186                     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  187                     th = 
inner_tcp_hdr(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  188                     
fun_eth_offload_init(&req->offload, flags,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  189                             
             shinfo->gso_size,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  190                             
             tcp_hdr_doff_flags(th), 0,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  191                             
             skb_inner_network_offset(skb),
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  192                             
             skb_inner_transport_offset(skb),
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  193                             
             skb_network_offset(skb), ol4_ofst);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  194                     
FUN_QSTAT_INC(q, tx_encap_tso);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  195             } else {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  196                     /* HW 
considers one set of headers as inner */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  197                     flags = 
FUN_ETH_INNER_LSO |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  198                             
FUN_ETH_UPDATE_INNER_L4_CKSUM |
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  199                             
FUN_ETH_UPDATE_INNER_L3_LEN;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  200                     if 
(shinfo->gso_type & SKB_GSO_TCPV6)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  201                             
flags |= FUN_ETH_INNER_IPV6;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  202                     else
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  203                             
flags |= FUN_ETH_UPDATE_INNER_L3_CKSUM;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  204                     th = 
tcp_hdr(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  205                     
fun_eth_offload_init(&req->offload, flags,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  206                             
             shinfo->gso_size,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  207                             
             tcp_hdr_doff_flags(th), 0,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  208                             
             skb_network_offset(skb),
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  209                             
             skb_transport_offset(skb), 0, 0);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  210                     
FUN_QSTAT_INC(q, tx_tso);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  211             }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  212  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  213             
u64_stats_update_begin(&q->syncp);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  214             q->stats.tx_cso 
+= shinfo->gso_segs;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  215             
u64_stats_update_end(&q->syncp);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  216  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  217             extra_pkts = 
shinfo->gso_segs - 1;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  218             extra_bytes = 
(be16_to_cpu(req->offload.inner_l4_off) +
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  219                            
__tcp_hdrlen(th)) * extra_pkts;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  220     } else if 
(likely(skb->ip_summed == CHECKSUM_PARTIAL)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  221             flags = 
FUN_ETH_UPDATE_INNER_L4_CKSUM;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  222             if 
(skb->csum_offset == offsetof(struct udphdr, check))
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  223                     flags 
|= FUN_ETH_INNER_UDP;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  224             
fun_eth_offload_init(&req->offload, flags, 0, 0, 0, 0,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  225                             
     skb_checksum_start_offset(skb), 0, 0);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  226             
FUN_QSTAT_INC(q, tx_cso);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  227     } else {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  228             
fun_eth_offload_init(&req->offload, 0, 0, 0, 0, 0, 0, 0, 0);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  229     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  230  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  231     ngle = shinfo->nr_frags 
+ 1;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  232     req->len8 = 
(sizeof(*req) + ngle * sizeof(*gle)) / 8;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  233     req->dataop = 
FUN_DATAOP_HDR_INIT(ngle, 0, ngle, 0, skb->len);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  234  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  235     for (i = 0, gle = 
(struct fun_dataop_gl *)req->dataop.imm;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  236          i < ngle && 
txq_to_end(q, gle); i++, gle++)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  237             
fun_dataop_gl_init(gle, 0, 0, lens[i], addrs[i]);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  238  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  239     if (txq_to_end(q, gle) 
== 0) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  240             gle = (struct 
fun_dataop_gl *)q->desc;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  241             for ( ; i < 
ngle; i++, gle++)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  242                     
fun_dataop_gl_init(gle, 0, 0, lens[i], addrs[i]);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  243     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  244  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  245     if 
(IS_ENABLED(CONFIG_TLS_DEVICE) && unlikely(tls_len)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  246             struct 
fun_eth_tls *tls = (struct fun_eth_tls *)gle;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  247             struct 
fun_ktls_tx_ctx *tls_ctx;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  248  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  249             req->len8 += 
FUNETH_TLS_SZ / 8;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  250             req->flags = 
cpu_to_be16(FUN_ETH_TX_TLS);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  251  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18 @252             tls_ctx = 
tls_driver_ctx(skb->sk, TLS_OFFLOAD_CTX_DIR_TX);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18 @253             tls->tlsid = 
tls_ctx->tlsid;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  254             
tls_ctx->next_seq += tls_len;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  255  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  256             
u64_stats_update_begin(&q->syncp);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  257             
q->stats.tx_tls_bytes += tls_len;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  258             
q->stats.tx_tls_pkts += 1 + extra_pkts;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  259             
u64_stats_update_end(&q->syncp);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  260     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  261  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  262     
u64_stats_update_begin(&q->syncp);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  263     q->stats.tx_bytes += 
skb->len + extra_bytes;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  264     q->stats.tx_pkts += 1 + 
extra_pkts;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  265     
u64_stats_update_end(&q->syncp);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  266  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  267     q->info[idx].skb = skb;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  268  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  269     trace_funeth_tx(q, 
skb->len, idx, req->dataop.ngather);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  270     return 
tx_req_ndesc(req);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  271  }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  272  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  273  /* Return the number of 
available descriptors of a Tx queue.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  274   * HW assumes head==tail 
means the ring is empty so we need to keep one
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  275   * descriptor unused.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  276   */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  277  static unsigned int 
fun_txq_avail(const struct funeth_txq *q)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  278  {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  279     return q->mask - 
q->prod_cnt + q->cons_cnt;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  280  }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  281  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  282  /* Stop a queue if it 
can't handle another worst-case packet. */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  283  static void 
fun_tx_check_stop(struct funeth_txq *q)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  284  {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  285     if 
(likely(fun_txq_avail(q) >= FUNETH_MAX_PKT_DESC))
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  286             return;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  287  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  288     
netif_tx_stop_queue(q->ndq);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  289  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  290     /* NAPI reclaim is 
freeing packets in parallel with us and we may race.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  291      * We have stopped the 
queue but check again after synchronizing with
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  292      * reclaim.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  293      */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  294     smp_mb();
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  295     if 
(likely(fun_txq_avail(q) < FUNETH_MAX_PKT_DESC))
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  296             
FUN_QSTAT_INC(q, tx_nstops);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  297     else
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  298             
netif_tx_start_queue(q->ndq);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  299  }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  300  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  301  /* Return true if a queue 
has enough space to restart. Current condition is
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  302   * that the queue must be 
>= 1/4 empty.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  303   */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  304  static bool 
fun_txq_may_restart(struct funeth_txq *q)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  305  {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  306     return fun_txq_avail(q) 
>= q->mask / 4;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  307  }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  308  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  309  netdev_tx_t 
fun_start_xmit(struct sk_buff *skb, struct net_device *netdev)
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  310  {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  311     struct funeth_priv *fp 
= netdev_priv(netdev);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  312     unsigned int qid = 
skb_get_queue_mapping(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  313     struct funeth_txq *q = 
fp->txqs[qid];
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  314     unsigned int tls_len = 
0;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  315     unsigned int ndesc;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  316  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  317     if 
(IS_ENABLED(CONFIG_TLS_DEVICE) && skb->sk &&
2458c35a3a5d46 Dimitris Michailidis 2022-02-18 @318         
tls_is_sk_tx_device_offloaded(skb->sk)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18 @319             skb = 
fun_tls_tx(skb, q, &tls_len);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  320             if 
(unlikely(!skb))
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  321                     goto 
dropped;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  322     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  323  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  324     ndesc = 
write_pkt_desc(skb, q, tls_len);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  325     if (unlikely(!ndesc)) {
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  326             
dev_kfree_skb_any(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  327             goto dropped;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  328     }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  329  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  330     q->prod_cnt += ndesc;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  331     fun_tx_check_stop(q);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  332  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  333     skb_tx_timestamp(skb);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  334  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  335     if 
(__netdev_tx_sent_queue(q->ndq, skb->len, netdev_xmit_more()))
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  336             
fun_txq_wr_db(q);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  337     else
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  338             
FUN_QSTAT_INC(q, tx_more);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  339  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  340     return NETDEV_TX_OK;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  341  
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  342  dropped:
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  343     /* A dropped packet may 
be the last one in a xmit_more train,
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  344      * ring the doorbell 
just in case.
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  345      */
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  346     if (!netdev_xmit_more())
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  347             
fun_txq_wr_db(q);
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  348     return NETDEV_TX_OK;
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  349  }
2458c35a3a5d46 Dimitris Michailidis 2022-02-18  350  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]
_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to