]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
Merge branches 'pm-core', 'pm-qos', 'pm-domains' and 'pm-opp'
[linux.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_rx.c
index 33495d88aeb21469861fd2a9e22463cabe75e9b2..06d5e6fecb0a5ecf255c9d6319ffb285e1a660df 100644 (file)
@@ -164,14 +164,14 @@ void mlx5e_modify_rx_cqe_compression(struct mlx5e_priv *priv, bool val)
 
        mutex_lock(&priv->state_lock);
 
-       if (priv->params.rx_cqe_compress == val)
+       if (MLX5E_GET_PFLAG(priv, MLX5E_PFLAG_RX_CQE_COMPRESS) == val)
                goto unlock;
 
        was_opened = test_bit(MLX5E_STATE_OPENED, &priv->state);
        if (was_opened)
                mlx5e_close_locked(priv->netdev);
 
-       priv->params.rx_cqe_compress = val;
+       MLX5E_SET_PFLAG(priv, MLX5E_PFLAG_RX_CQE_COMPRESS, val);
 
        if (was_opened)
                mlx5e_open_locked(priv->netdev);
@@ -193,6 +193,9 @@ static inline bool mlx5e_rx_cache_put(struct mlx5e_rq *rq,
                return false;
        }
 
+       if (unlikely(page_is_pfmemalloc(dma_info->page)))
+               return false;
+
        cache->page_cache[cache->tail] = *dma_info;
        cache->tail = tail_next;
        return true;
@@ -737,10 +740,10 @@ static inline
 struct sk_buff *skb_from_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe,
                             u16 wqe_counter, u32 cqe_bcnt)
 {
-       struct bpf_prog *xdp_prog = READ_ONCE(rq->xdp_prog);
        struct mlx5e_dma_info *di;
        struct sk_buff *skb;
        void *va, *data;
+       bool consumed;
 
        di             = &rq->dma_info[wqe_counter];
        va             = page_address(di->page);
@@ -759,7 +762,11 @@ struct sk_buff *skb_from_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe,
                return NULL;
        }
 
-       if (mlx5e_xdp_handle(rq, xdp_prog, di, data, cqe_bcnt))
+       rcu_read_lock();
+       consumed = mlx5e_xdp_handle(rq, READ_ONCE(rq->xdp_prog), di, data,
+                                   cqe_bcnt);
+       rcu_read_unlock();
+       if (consumed)
                return NULL; /* page/packet was consumed by XDP */
 
        skb = build_skb(va, RQ_PAGE_SIZE(rq));