diff mbox series

[V1,net-next,5/8] net: ena: add support for traffic mirroring

Message ID 1594321503-12256-6-git-send-email-akiyano@amazon.com
State Changes Requested
Delegated to: David Miller
Headers show
Series ENA driver new features | expand

Commit Message

Kiyanovski, Arthur July 9, 2020, 7:05 p.m. UTC
From: Arthur Kiyanovski <akiyano@amazon.com>

Add support for traffic mirroring, where the hardware reads the
buffer from the instance memory directly.

Traffic Mirroring needs access to the rx buffers in the instance.
To have this access, this patch:
1. Changes the code to map and unmap the rx buffers bidirectionally.
2. Enables the relevant bit in driver_supported_features to indicate
   to the FW that this driver supports traffic mirroring.

Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>
---
 drivers/net/ethernet/amazon/ena/ena_admin_defs.h |  5 ++++-
 drivers/net/ethernet/amazon/ena/ena_netdev.c     | 15 +++++++++------
 2 files changed, 13 insertions(+), 7 deletions(-)

Comments

Jakub Kicinski July 9, 2020, 8:22 p.m. UTC | #1
On Thu, 9 Jul 2020 22:05:00 +0300 akiyano@amazon.com wrote:
> From: Arthur Kiyanovski <akiyano@amazon.com>
> 
> Add support for traffic mirroring, where the hardware reads the
> buffer from the instance memory directly.
> 
> Traffic Mirroring needs access to the rx buffers in the instance.
> To have this access, this patch:
> 1. Changes the code to map and unmap the rx buffers bidirectionally.
> 2. Enables the relevant bit in driver_supported_features to indicate
>    to the FW that this driver supports traffic mirroring.
> 
> Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>

Any more information? You map rx buffers bidirectionally, doesn't mean
the instance doesn't modify the buffer causing the mirror to see a
modified frame..  Does the instance wait somehow for the mirror to be
done, or is the RX completion not generated until mirror operation is
done?
Bshara, Nafea July 10, 2020, 8:56 a.m. UTC | #2
Sent from my iPhone

> On Jul 9, 2020, at 11:23 PM, Jakub Kicinski <kuba@kernel.org> wrote:
> 
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you can confirm the sender and know the content is safe.
> 
> 
> 
>> On Thu, 9 Jul 2020 22:05:00 +0300 akiyano@amazon.com wrote:
>> From: Arthur Kiyanovski <akiyano@amazon.com>
>> 
>> Add support for traffic mirroring, where the hardware reads the
>> buffer from the instance memory directly.
>> 
>> Traffic Mirroring needs access to the rx buffers in the instance.
>> To have this access, this patch:
>> 1. Changes the code to map and unmap the rx buffers bidirectionally.
>> 2. Enables the relevant bit in driver_supported_features to indicate
>>   to the FW that this driver supports traffic mirroring.
>> 
>> Signed-off-by: Arthur Kiyanovski <akiyano@amazon.com>
> 
> Any more information? You map rx buffers bidirectionally, doesn't mean
> the instance doesn't modify the buffer causing the mirror to see a
> modified frame..  Does the instance wait somehow for the mirror to be
> done, or is the RX completion not generated until mirror operation is
> done?

Rx completion is not generated until mirroring is done
diff mbox series

Patch

diff --git a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
index 336742f6e3c3..afe87ff09b20 100644
--- a/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
+++ b/drivers/net/ethernet/amazon/ena/ena_admin_defs.h
@@ -816,7 +816,8 @@  struct ena_admin_host_info {
 	/* 0 : reserved
 	 * 1 : rx_offset
 	 * 2 : interrupt_moderation
-	 * 31:3 : reserved
+	 * 3 : rx_buf_mirroring
+	 * 31:4 : reserved
 	 */
 	u32 driver_supported_features;
 };
@@ -1129,6 +1130,8 @@  struct ena_admin_ena_mmio_req_read_less_resp {
 #define ENA_ADMIN_HOST_INFO_RX_OFFSET_MASK                  BIT(1)
 #define ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_SHIFT      2
 #define ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK       BIT(2)
+#define ENA_ADMIN_HOST_INFO_RX_BUF_MIRRORING_SHIFT          3
+#define ENA_ADMIN_HOST_INFO_RX_BUF_MIRRORING_MASK           BIT(3)
 
 /* aenq_common_desc */
 #define ENA_ADMIN_AENQ_COMMON_DESC_PHASE_MASK               BIT(0)
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index 18a30a81a475..fd5f0d87cc59 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -959,8 +959,11 @@  static int ena_alloc_rx_page(struct ena_ring *rx_ring,
 		return -ENOMEM;
 	}
 
+	/* To enable NIC-side port-mirroring, AKA SPAN port,
+	 * we make the buffer readable from the nic as well
+	 */
 	dma = dma_map_page(rx_ring->dev, page, 0, ENA_PAGE_SIZE,
-			   DMA_FROM_DEVICE);
+			   DMA_BIDIRECTIONAL);
 	if (unlikely(dma_mapping_error(rx_ring->dev, dma))) {
 		u64_stats_update_begin(&rx_ring->syncp);
 		rx_ring->rx_stats.dma_mapping_err++;
@@ -993,10 +996,9 @@  static void ena_free_rx_page(struct ena_ring *rx_ring,
 		return;
 	}
 
-	dma_unmap_page(rx_ring->dev,
-		       ena_buf->paddr - rx_ring->rx_headroom,
+	dma_unmap_page(rx_ring->dev, ena_buf->paddr - rx_ring->rx_headroom,
 		       ENA_PAGE_SIZE,
-		       DMA_FROM_DEVICE);
+		       DMA_BIDIRECTIONAL);
 
 	__free_page(page);
 	rx_info->page = NULL;
@@ -1431,7 +1433,7 @@  static struct sk_buff *ena_rx_skb(struct ena_ring *rx_ring,
 	do {
 		dma_unmap_page(rx_ring->dev,
 			       dma_unmap_addr(&rx_info->ena_buf, paddr),
-			       ENA_PAGE_SIZE, DMA_FROM_DEVICE);
+			       ENA_PAGE_SIZE, DMA_BIDIRECTIONAL);
 
 		skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_info->page,
 				rx_info->page_offset, len, ENA_PAGE_SIZE);
@@ -3123,7 +3125,8 @@  static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pd
 
 	host_info->driver_supported_features =
 		ENA_ADMIN_HOST_INFO_RX_OFFSET_MASK |
-		ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK;
+		ENA_ADMIN_HOST_INFO_INTERRUPT_MODERATION_MASK |
+		ENA_ADMIN_HOST_INFO_RX_BUF_MIRRORING_MASK;
 
 	rc = ena_com_set_host_attributes(ena_dev);
 	if (rc) {