All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@oracle.com>
To: ap420073@gmail.com
Cc: kernel-janitors@vger.kernel.org
Subject: [bug report] net: atlantic: Implement xdp data plane
Date: Tue, 19 Jul 2022 14:18:33 +0300	[thread overview]
Message-ID: <YtaTCWFeFquphes0@kili> (raw)

Hello Taehee Yoo,

The patch 26efaef759a1: "net: atlantic: Implement xdp data plane"
from Apr 17, 2022, leads to the following Smatch static checker
warning:

drivers/net/ethernet/aquantia/atlantic/aq_ring.c:496 aq_xdp_run_prog() error: passing non negative 6 to ERR_PTR

drivers/net/ethernet/aquantia/atlantic/aq_ring.c
    415 static struct sk_buff *aq_xdp_run_prog(struct aq_nic_s *aq_nic,
    416                                        struct xdp_buff *xdp,
    417                                        struct aq_ring_s *rx_ring,
    418                                        struct aq_ring_buff_s *buff)
    419 {
    420         int result = NETDEV_TX_BUSY;
    421         struct aq_ring_s *tx_ring;
    422         struct xdp_frame *xdpf;
    423         struct bpf_prog *prog;
    424         u32 act = XDP_ABORTED;
    425         struct sk_buff *skb;
    426 
    427         u64_stats_update_begin(&rx_ring->stats.rx.syncp);
    428         ++rx_ring->stats.rx.packets;
    429         rx_ring->stats.rx.bytes += xdp_get_buff_len(xdp);
    430         u64_stats_update_end(&rx_ring->stats.rx.syncp);
    431 
    432         prog = READ_ONCE(rx_ring->xdp_prog);
    433         if (!prog)
    434                 goto pass;
    435 
    436         prefetchw(xdp->data_hard_start); /* xdp_frame write */
    437 
    438         /* single buffer XDP program, but packet is multi buffer, aborted */
    439         if (xdp_buff_has_frags(xdp) && !prog->aux->xdp_has_frags)
    440                 goto out_aborted;
    441 
    442         act = bpf_prog_run_xdp(prog, xdp);
    443         switch (act) {
    444         case XDP_PASS:
    445 pass:
    446                 xdpf = xdp_convert_buff_to_frame(xdp);
    447                 if (unlikely(!xdpf))
    448                         goto out_aborted;
    449                 skb = xdp_build_skb_from_frame(xdpf, aq_nic->ndev);
    450                 if (!skb)
    451                         goto out_aborted;
    452                 u64_stats_update_begin(&rx_ring->stats.rx.syncp);
    453                 ++rx_ring->stats.rx.xdp_pass;
    454                 u64_stats_update_end(&rx_ring->stats.rx.syncp);
    455                 aq_get_rxpages_xdp(buff, xdp);
    456                 return skb;
    457         case XDP_TX:
    458                 xdpf = xdp_convert_buff_to_frame(xdp);
    459                 if (unlikely(!xdpf))
    460                         goto out_aborted;
    461                 tx_ring = aq_nic->aq_ring_tx[rx_ring->idx];
    462                 result = aq_nic_xmit_xdpf(aq_nic, tx_ring, xdpf);
    463                 if (result == NETDEV_TX_BUSY)
    464                         goto out_aborted;

The aq_nic_xmit_xdpf() function returns zero on success and a mix of
NETDEV_TX_BUSY or negative error codes on failure.  Mixing error codes...

    465                 u64_stats_update_begin(&rx_ring->stats.rx.syncp);
    466                 ++rx_ring->stats.rx.xdp_tx;
    467                 u64_stats_update_end(&rx_ring->stats.rx.syncp);
    468                 aq_get_rxpages_xdp(buff, xdp);
    469                 break;
    470         case XDP_REDIRECT:
    471                 if (xdp_do_redirect(aq_nic->ndev, xdp, prog) < 0)
    472                         goto out_aborted;
    473                 xdp_do_flush();
    474                 u64_stats_update_begin(&rx_ring->stats.rx.syncp);
    475                 ++rx_ring->stats.rx.xdp_redirect;
    476                 u64_stats_update_end(&rx_ring->stats.rx.syncp);
    477                 aq_get_rxpages_xdp(buff, xdp);
    478                 break;
    479         default:
    480                 fallthrough;
    481         case XDP_ABORTED:
    482 out_aborted:
    483                 u64_stats_update_begin(&rx_ring->stats.rx.syncp);
    484                 ++rx_ring->stats.rx.xdp_aborted;
    485                 u64_stats_update_end(&rx_ring->stats.rx.syncp);
    486                 trace_xdp_exception(aq_nic->ndev, prog, act);
    487                 bpf_warn_invalid_xdp_action(aq_nic->ndev, prog, act);
    488                 break;
    489         case XDP_DROP:
    490                 u64_stats_update_begin(&rx_ring->stats.rx.syncp);
    491                 ++rx_ring->stats.rx.xdp_drop;
    492                 u64_stats_update_end(&rx_ring->stats.rx.syncp);
    493                 break;
    494         }
    495 
--> 496         return ERR_PTR(-result);

... is always risky and will lead to a crash in the caller.

    497 }

regards,
dan carpenter

             reply	other threads:[~2022-07-19 11:18 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-07-19 11:18 Dan Carpenter [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-08-09  8:56 [bug report] net: atlantic: Implement xdp data plane Dan Carpenter

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=YtaTCWFeFquphes0@kili \
    --to=dan.carpenter@oracle.com \
    --cc=ap420073@gmail.com \
    --cc=kernel-janitors@vger.kernel.org \
    /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.