Re: [ovs-dev] [PATCH V2 06/14] dpif-netdev: Add HW miss packet state recover logic

2021-02-23 Thread Eli Britstein



On 2/24/2021 7:36 AM, Sriharsha Basavapatna wrote:

On Wed, Feb 10, 2021 at 8:57 PM Eli Britstein  wrote:

Recover the packet if it was partially processed by the HW. Fallback to
lookup flow by mark association.

Signed-off-by: Eli Britstein 
Reviewed-by: Gaetan Rivet 
---
  lib/dpif-netdev.c | 46 ++
  1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index e3fd0a07f..09e86631e 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -7036,6 +7036,10 @@ smc_lookup_batch(struct dp_netdev_pmd_thread *pmd,
  pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SMC_HIT, n_smc_hit);
  }

+static struct tx_port *
+pmd_send_port_cache_lookup(const struct dp_netdev_pmd_thread *pmd,
+   odp_port_t port_no);
+
  /* Try to process all ('cnt') the 'packets' using only the datapath flow cache
   * 'pmd->flow_cache'. If a flow is not found for a packet 'packets[i]', the
   * miniflow is copied into 'keys' and the packet pointer is moved at the
@@ -7099,23 +7103,33 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd,
  pkt_metadata_init(&packet->md, port_no);
  }

-if ((*recirc_depth_get() == 0) &&
-dp_packet_has_flow_mark(packet, &mark)) {
-flow = mark_to_flow_find(pmd, mark);
-if (OVS_LIKELY(flow)) {
-tcp_flags = parse_tcp_flags(packet);
-if (OVS_LIKELY(batch_enable)) {
-dp_netdev_queue_batches(packet, flow, tcp_flags, batches,
-n_batches);
-} else {
-/* Flow batching should be performed only after fast-path
- * processing is also completed for packets with emc miss
- * or else it will result in reordering of packets with
- * same datapath flows. */
-packet_enqueue_to_flow_map(packet, flow, tcp_flags,
-   flow_map, map_cnt++);
+if (*recirc_depth_get() == 0) {
+/* Restore the packet if HW processing was terminated before
+ * completion.
+ */
+struct tx_port *p;
+
+tcp_flags = parse_tcp_flags(packet);
+p = pmd_send_port_cache_lookup(pmd, port_no);
+if (!p || netdev_hw_miss_packet_recover(p->port->netdev, packet)) {
+if (dp_packet_has_flow_mark(packet, &mark)) {
+flow = mark_to_flow_find(pmd, mark);
+if (OVS_LIKELY(flow)) {
+if (OVS_LIKELY(batch_enable)) {
+dp_netdev_queue_batches(packet, flow, tcp_flags,
+batches, n_batches);
+} else {
+/* Flow batching should be performed only after
+ * fast-path processing is also completed for
+ * packets with emc miss or else it will result in
+ * reordering of packets with same datapath flows.
+ */
+packet_enqueue_to_flow_map(packet, flow, tcp_flags,
+   flow_map, map_cnt++);
+}
+continue;
+}
  }
-continue;
  }
  }

The above logic should be changed to avoid hw_miss_packet_recover()
when hw-offload is not enabled:

if (*recirc_depth_get() == 0) {
 ...
 ...
 if (netdev_is_flow_api_enabled()) {
 p = pmd_send_port_cache_lookup(pmd, port_no);
 if (OVS_UNLIKELY(p && !netdev_hw_miss_packet_recover(p->port->netdev,
   packet))) {
 goto miniflow;
 }
 }
 if (dp_packet_has_flow_mark(packet, &mark)) {
 flow = mark_to_flow_find(pmd, mark);
 if (OVS_LIKELY(flow)) {
 ...
 }
 }
}

miniflow:
 miniflow_extract();


OK, I will refactor to introduce usage of netdev_is_flow_api_enabled() 
and clarify.


Thanks.




--
2.28.0.546.g385c171


___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH V2 06/14] dpif-netdev: Add HW miss packet state recover logic

2021-02-23 Thread Sriharsha Basavapatna via dev
On Wed, Feb 10, 2021 at 8:57 PM Eli Britstein  wrote:
>
> Recover the packet if it was partially processed by the HW. Fallback to
> lookup flow by mark association.
>
> Signed-off-by: Eli Britstein 
> Reviewed-by: Gaetan Rivet 
> ---
>  lib/dpif-netdev.c | 46 ++
>  1 file changed, 30 insertions(+), 16 deletions(-)
>
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index e3fd0a07f..09e86631e 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -7036,6 +7036,10 @@ smc_lookup_batch(struct dp_netdev_pmd_thread *pmd,
>  pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SMC_HIT, n_smc_hit);
>  }
>
> +static struct tx_port *
> +pmd_send_port_cache_lookup(const struct dp_netdev_pmd_thread *pmd,
> +   odp_port_t port_no);
> +
>  /* Try to process all ('cnt') the 'packets' using only the datapath flow 
> cache
>   * 'pmd->flow_cache'. If a flow is not found for a packet 'packets[i]', the
>   * miniflow is copied into 'keys' and the packet pointer is moved at the
> @@ -7099,23 +7103,33 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd,
>  pkt_metadata_init(&packet->md, port_no);
>  }
>
> -if ((*recirc_depth_get() == 0) &&
> -dp_packet_has_flow_mark(packet, &mark)) {
> -flow = mark_to_flow_find(pmd, mark);
> -if (OVS_LIKELY(flow)) {
> -tcp_flags = parse_tcp_flags(packet);
> -if (OVS_LIKELY(batch_enable)) {
> -dp_netdev_queue_batches(packet, flow, tcp_flags, batches,
> -n_batches);
> -} else {
> -/* Flow batching should be performed only after fast-path
> - * processing is also completed for packets with emc miss
> - * or else it will result in reordering of packets with
> - * same datapath flows. */
> -packet_enqueue_to_flow_map(packet, flow, tcp_flags,
> -   flow_map, map_cnt++);
> +if (*recirc_depth_get() == 0) {
> +/* Restore the packet if HW processing was terminated before
> + * completion.
> + */
> +struct tx_port *p;
> +
> +tcp_flags = parse_tcp_flags(packet);
> +p = pmd_send_port_cache_lookup(pmd, port_no);
> +if (!p || netdev_hw_miss_packet_recover(p->port->netdev, 
> packet)) {
> +if (dp_packet_has_flow_mark(packet, &mark)) {
> +flow = mark_to_flow_find(pmd, mark);
> +if (OVS_LIKELY(flow)) {
> +if (OVS_LIKELY(batch_enable)) {
> +dp_netdev_queue_batches(packet, flow, tcp_flags,
> +batches, n_batches);
> +} else {
> +/* Flow batching should be performed only after
> + * fast-path processing is also completed for
> + * packets with emc miss or else it will result 
> in
> + * reordering of packets with same datapath 
> flows.
> + */
> +packet_enqueue_to_flow_map(packet, flow, 
> tcp_flags,
> +   flow_map, map_cnt++);
> +}
> +continue;
> +}
>  }
> -continue;
>  }
>  }

The above logic should be changed to avoid hw_miss_packet_recover()
when hw-offload is not enabled:

if (*recirc_depth_get() == 0) {
...
...
if (netdev_is_flow_api_enabled()) {
p = pmd_send_port_cache_lookup(pmd, port_no);
if (OVS_UNLIKELY(p && !netdev_hw_miss_packet_recover(p->port->netdev,
  packet))) {
goto miniflow;
}
}
if (dp_packet_has_flow_mark(packet, &mark)) {
flow = mark_to_flow_find(pmd, mark);
if (OVS_LIKELY(flow)) {
...
}
}
}

miniflow:
miniflow_extract();

>
> --
> 2.28.0.546.g385c171
>

-- 
This electronic communication and the information and any files transmitted 
with it, or attached to it, are confidential and are intended solely for 
the use of the individual or entity to whom it is addressed and may contain 
information that is confidential, legally privileged, protected by privacy 
laws, or otherwise restricted from disclosure to anyone else. If you are 
not the intended recipient or the person responsible for delivering the 
e-mail to the intended recipient, you are hereby notified that any use, 
copying, distributing, dissemination, forwarding, printing, or copying of 
this e-mail is strictly prohibited. If you received this e-mail in error, 
please return the e-mail to the sender, delete it from

[ovs-dev] [PATCH V2 06/14] dpif-netdev: Add HW miss packet state recover logic

2021-02-10 Thread Eli Britstein
Recover the packet if it was partially processed by the HW. Fallback to
lookup flow by mark association.

Signed-off-by: Eli Britstein 
Reviewed-by: Gaetan Rivet 
---
 lib/dpif-netdev.c | 46 ++
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
index e3fd0a07f..09e86631e 100644
--- a/lib/dpif-netdev.c
+++ b/lib/dpif-netdev.c
@@ -7036,6 +7036,10 @@ smc_lookup_batch(struct dp_netdev_pmd_thread *pmd,
 pmd_perf_update_counter(&pmd->perf_stats, PMD_STAT_SMC_HIT, n_smc_hit);
 }
 
+static struct tx_port *
+pmd_send_port_cache_lookup(const struct dp_netdev_pmd_thread *pmd,
+   odp_port_t port_no);
+
 /* Try to process all ('cnt') the 'packets' using only the datapath flow cache
  * 'pmd->flow_cache'. If a flow is not found for a packet 'packets[i]', the
  * miniflow is copied into 'keys' and the packet pointer is moved at the
@@ -7099,23 +7103,33 @@ dfc_processing(struct dp_netdev_pmd_thread *pmd,
 pkt_metadata_init(&packet->md, port_no);
 }
 
-if ((*recirc_depth_get() == 0) &&
-dp_packet_has_flow_mark(packet, &mark)) {
-flow = mark_to_flow_find(pmd, mark);
-if (OVS_LIKELY(flow)) {
-tcp_flags = parse_tcp_flags(packet);
-if (OVS_LIKELY(batch_enable)) {
-dp_netdev_queue_batches(packet, flow, tcp_flags, batches,
-n_batches);
-} else {
-/* Flow batching should be performed only after fast-path
- * processing is also completed for packets with emc miss
- * or else it will result in reordering of packets with
- * same datapath flows. */
-packet_enqueue_to_flow_map(packet, flow, tcp_flags,
-   flow_map, map_cnt++);
+if (*recirc_depth_get() == 0) {
+/* Restore the packet if HW processing was terminated before
+ * completion.
+ */
+struct tx_port *p;
+
+tcp_flags = parse_tcp_flags(packet);
+p = pmd_send_port_cache_lookup(pmd, port_no);
+if (!p || netdev_hw_miss_packet_recover(p->port->netdev, packet)) {
+if (dp_packet_has_flow_mark(packet, &mark)) {
+flow = mark_to_flow_find(pmd, mark);
+if (OVS_LIKELY(flow)) {
+if (OVS_LIKELY(batch_enable)) {
+dp_netdev_queue_batches(packet, flow, tcp_flags,
+batches, n_batches);
+} else {
+/* Flow batching should be performed only after
+ * fast-path processing is also completed for
+ * packets with emc miss or else it will result in
+ * reordering of packets with same datapath flows.
+ */
+packet_enqueue_to_flow_map(packet, flow, tcp_flags,
+   flow_map, map_cnt++);
+}
+continue;
+}
 }
-continue;
 }
 }
 
-- 
2.28.0.546.g385c171

___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev