unsigned int mb_len = rte_pktmbuf_data_room_size(mp);
        unsigned int mprq_stride_size;
        struct mlx5_dev_config *config = &priv->config;
-       /*
-        * LRO packet may consume all the stride memory, hence we cannot
-        * guaranty head-room. A new striding RQ feature may be added in CX6 DX
-        * to allow head-room and tail-room for the LRO packets.
-        */
-       unsigned int strd_headroom_en = mlx5_lro_on(dev) ? 0 : 1;
+       unsigned int strd_headroom_en;
        /*
         * Always allocate extra slots, even if eventually
         * the vector Rx will not be used.
        tmpl->socket = socket;
        if (dev->data->dev_conf.intr_conf.rxq)
                tmpl->irq = 1;
+       /*
+        * LRO packet may consume all the stride memory, hence we cannot
+        * guaranty head-room near the packet memory in the stride.
+        * In this case scatter is, for sure, enabled and an empty mbuf may be
+        * added in the start for the head-room.
+        */
+       if (mlx5_lro_on(dev) && RTE_PKTMBUF_HEADROOM > 0 &&
+           non_scatter_min_mbuf_size > mb_len) {
+               strd_headroom_en = 0;
+               mprq_stride_size = RTE_MIN(max_rx_pkt_len,
+                                       1u << config->mprq.max_stride_size_n);
+       } else {
+               strd_headroom_en = 1;
+               mprq_stride_size = non_scatter_min_mbuf_size;
+       }
        /*
         * This Rx queue can be configured as a Multi-Packet RQ if all of the
         * following conditions are met:
         *    stride.
         *  Otherwise, enable Rx scatter if necessary.
         */
-       mprq_stride_size = max_rx_pkt_len + RTE_PKTMBUF_HEADROOM *
-                               strd_headroom_en;
        if (mprq_en &&
            desc > (1U << config->mprq.stride_num_n) &&
            mprq_stride_size <= (1U << config->mprq.max_stride_size_n)) {
 
                                continue;
                        }
                        rte_memcpy(rte_pktmbuf_mtod(pkt, void *), addr, len);
+                       DATA_LEN(pkt) = len;
                } else {
                        rte_iova_t buf_iova;
                        struct rte_mbuf_ext_shared_info *shinfo;
                                ++rxq->stats.idropped;
                                continue;
                        }
+                       DATA_LEN(pkt) = len;
+                       /*
+                        * LRO packet may consume all the stride memory, in this
+                        * case packet head-room space is not guaranteed so must
+                        * to add an empty mbuf for the head-room.
+                        */
+                       if (!rxq->strd_headroom_en) {
+                               struct rte_mbuf *headroom_mbuf =
+                                               rte_pktmbuf_alloc(rxq->mp);
+
+                               if (unlikely(headroom_mbuf == NULL)) {
+                                       rte_pktmbuf_free_seg(pkt);
+                                       ++rxq->stats.rx_nombuf;
+                                       break;
+                               }
+                               PORT(pkt) = rxq->port_id;
+                               NEXT(headroom_mbuf) = pkt;
+                               pkt = headroom_mbuf;
+                               NB_SEGS(pkt) = 2;
+                       }
                }
                rxq_cq_to_mbuf(rxq, pkt, cqe, rss_hash_res);
                if (lro_num_seg > 1) {
                        pkt->tso_segsz = strd_sz;
                }
                PKT_LEN(pkt) = len;
-               DATA_LEN(pkt) = len;
                PORT(pkt) = rxq->port_id;
 #ifdef MLX5_PMD_SOFT_COUNTERS
                /* Increment bytes counter. */