diff --git a/sys/dev/ena/ena.c b/sys/dev/ena/ena.c index 7a760477f0f..2bf69e1ceed 100644 --- a/sys/dev/ena/ena.c +++ b/sys/dev/ena/ena.c @@ -3519,6 +3519,11 @@ ena_attach(device_t pdev) goto err_com_free; } + if (ena_dev->tx_mem_queue_type == ENA_ADMIN_PLACEMENT_POLICY_DEV) + adapter->disable_meta_caching = + !!(get_feat_ctx.llq.accel_mode.u.get.supported_flags & + BIT(ENA_ADMIN_DISABLE_META_CACHING)); + adapter->keep_alive_timestamp = getsbinuptime(); adapter->tx_offload_cap = get_feat_ctx.offload.tx; diff --git a/sys/dev/ena/ena.h b/sys/dev/ena/ena.h index 472fd53c9f8..4a4f8819083 100644 --- a/sys/dev/ena/ena.h +++ b/sys/dev/ena/ena.h @@ -461,6 +461,7 @@ struct ena_adapter { sbintime_t missing_tx_timeout; uint32_t missing_tx_max_queues; uint32_t missing_tx_threshold; + bool disable_meta_caching; /* Statistics */ struct ena_stats_dev dev_stats; diff --git a/sys/dev/ena/ena_datapath.c b/sys/dev/ena/ena_datapath.c index 5401b8ae27a..439d6ccb005 100644 --- a/sys/dev/ena/ena_datapath.c +++ b/sys/dev/ena/ena_datapath.c @@ -49,7 +49,7 @@ static struct mbuf* ena_rx_mbuf(struct ena_ring *, struct ena_com_rx_buf_info *, struct ena_com_rx_ctx *, uint16_t *); static inline void ena_rx_checksum(struct ena_ring *, struct ena_com_rx_ctx *, struct mbuf *); -static void ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *); +static void ena_tx_csum(struct ena_com_tx_ctx *, struct mbuf *, bool); static int ena_check_and_collapse_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf); static int ena_xmit_mbuf(struct ena_ring *, struct mbuf **); @@ -675,7 +675,8 @@ error: } static void -ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct mbuf *mbuf) +ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct mbuf *mbuf, + bool disable_meta_caching) { struct ena_com_tx_meta *ena_meta; struct ether_vlan_header *eh; @@ -703,7 +704,12 @@ ena_tx_csum(struct ena_com_tx_ctx *ena_tx_ctx, struct mbuf *mbuf) offload = true; if (!offload) { - ena_tx_ctx->meta_valid = 0; + if (disable_meta_caching) { + memset(ena_meta, 0, sizeof(*ena_meta)); + ena_tx_ctx->meta_valid = 1; + } else { + ena_tx_ctx->meta_valid = 0; + } return; } @@ -989,7 +995,7 @@ ena_xmit_mbuf(struct ena_ring *tx_ring, struct mbuf **mbuf) ena_tx_ctx.header_len = header_len; /* Set flags and meta data */ - ena_tx_csum(&ena_tx_ctx, *mbuf); + ena_tx_csum(&ena_tx_ctx, *mbuf, adapter->disable_meta_caching); if (tx_ring->acum_pkts == DB_THRESHOLD || ena_com_is_doorbell_needed(tx_ring->ena_com_io_sq, &ena_tx_ctx)) {