I40E_VSI_STAT("rx_pg_alloc_fail", rx_page_failed),
        I40E_VSI_STAT("rx_cache_reuse", rx_page_reuse),
        I40E_VSI_STAT("rx_cache_alloc", rx_page_alloc),
+       I40E_VSI_STAT("rx_cache_waive", rx_page_waive),
 };
 
 /* These PF_STATs might look like duplicates of some NETDEV_STATs,
 
  **/
 static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
 {
-       u64 rx_page, rx_buf, rx_reuse, rx_alloc;
+       u64 rx_page, rx_buf, rx_reuse, rx_alloc, rx_waive;
        struct i40e_pf *pf = vsi->back;
        struct rtnl_link_stats64 *ons;
        struct rtnl_link_stats64 *ns;   /* netdev stats */
        rx_buf = 0;
        rx_reuse = 0;
        rx_alloc = 0;
+       rx_waive = 0;
        rcu_read_lock();
        for (q = 0; q < vsi->num_queue_pairs; q++) {
                /* locate Tx ring */
                rx_page += p->rx_stats.alloc_page_failed;
                rx_reuse += p->rx_stats.page_reuse_count;
                rx_alloc += p->rx_stats.page_alloc_count;
+               rx_waive += p->rx_stats.page_waive_count;
 
                if (i40e_enabled_xdp_vsi(vsi)) {
                        /* locate XDP ring */
        vsi->rx_buf_failed = rx_buf;
        vsi->rx_page_reuse = rx_reuse;
        vsi->rx_page_alloc = rx_alloc;
+       vsi->rx_page_waive = rx_waive;
 
        ns->rx_packets = rx_p;
        ns->rx_bytes = rx_b;
 
 /**
  * i40e_can_reuse_rx_page - Determine if page can be reused for another Rx
  * @rx_buffer: buffer containing the page
+ * @rx_stats: rx stats structure for the rx ring
  * @rx_buffer_pgcnt: buffer page refcount pre xdp_do_redirect() call
  *
  * If page is reusable, we have a green light for calling i40e_reuse_rx_page,
  * which will assign the current buffer to the buffer that next_to_alloc is
  * pointing to; otherwise, the DMA mapping needs to be destroyed and
- * page freed
+ * page freed.
+ *
+ * rx_stats will be updated to indicate if the page was waived because it was
+ * not reusable.
  */
 static bool i40e_can_reuse_rx_page(struct i40e_rx_buffer *rx_buffer,
+                                  struct i40e_rx_queue_stats *rx_stats,
                                   int rx_buffer_pgcnt)
 {
        unsigned int pagecnt_bias = rx_buffer->pagecnt_bias;
        struct page *page = rx_buffer->page;
 
        /* Is any reuse possible? */
-       if (!dev_page_is_reusable(page))
+       if (!dev_page_is_reusable(page)) {
+               rx_stats->page_waive_count++;
                return false;
+       }
 
 #if (PAGE_SIZE < 8192)
        /* if we are only owner of page we can reuse it */
                               struct i40e_rx_buffer *rx_buffer,
                               int rx_buffer_pgcnt)
 {
-       if (i40e_can_reuse_rx_page(rx_buffer, rx_buffer_pgcnt)) {
+       if (i40e_can_reuse_rx_page(rx_buffer, &rx_ring->rx_stats, rx_buffer_pgcnt)) {
                /* hand second half of page back to the ring */
                i40e_reuse_rx_page(rx_ring, rx_buffer);
        } else {