From 7093ff2355cb029d5988b474b5af05d396d36126 Mon Sep 17 00:00:00 2001
From: Aastha Mehta <aasthakm@mpi-sws.org>
Date: Mon, 30 Jul 2018 17:29:16 +0000
Subject: [PATCH] bugfix: interception to free skbs based on incoming acks

ignore interception for DBG_LOG config of pacer module
---
 .../ethernet/broadcom/bnx2x/sme/ptcp_hooks.c  |  9 ++++++
 .../ethernet/broadcom/bnx2x/sme/ptcp_hooks.h  |  2 ++
 .../broadcom/bnx2x/sme/ptcp_hooks_impl.c      | 15 ++++++++++
 .../broadcom/bnx2x/sme/ptcp_hooks_impl.h      |  5 +++-
 net/ipv4/tcp_input.c                          | 29 +++++++++++++------
 5 files changed, 50 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.c b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.c
index dc30baed6..ae715b5af 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.c
@@ -36,6 +36,7 @@
 
 struct ptcp_hook_heads ptcp_hook_heads = {
   .print_sock_skb = LIST_HEAD_INIT(ptcp_hook_heads.print_sock_skb),
+  .rx_do_clean = LIST_HEAD_INIT(ptcp_hook_heads.rx_do_clean),
   .rx_handle_tcp_urg = LIST_HEAD_INIT(ptcp_hook_heads.rx_handle_tcp_urg),
   .rx_handle_dummy = LIST_HEAD_INIT(ptcp_hook_heads.rx_handle_dummy),
   .rx_disable_coalesce = LIST_HEAD_INIT(ptcp_hook_heads.rx_disable_coalesce),
@@ -53,6 +54,14 @@ void ptcp_print_sock_skb(struct sock *sk, struct sk_buff *skb, char *dbg_str)
 }
 EXPORT_SYMBOL(ptcp_print_sock_skb);
 
+int ptcp_rx_do_clean(struct sock *sk, int prior_fackets, u32 prior_snd_una,
+    int *acked, void *sack_state, struct skb_mstamp *now)
+{
+  return call_ptcp_int_hook(rx_do_clean, -1, sk, prior_fackets,
+      prior_snd_una, acked, sack_state, now);
+}
+EXPORT_SYMBOL(ptcp_rx_do_clean);
+
 int ptcp_rx_handle_tcp_urg(struct sock *sk, struct sk_buff *skb, struct tcphdr *th)
 {
   return call_ptcp_int_hook(rx_handle_tcp_urg, -1, sk, skb, th);
diff --git a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.h b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.h
index ce02d8ae4..254de49ab 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks.h
@@ -16,6 +16,8 @@
 #include <linux/tcp.h>
 
 void ptcp_print_sock_skb(struct sock *sk, struct sk_buff *skb, char *dbg_str);
+int ptcp_rx_do_clean(struct sock *sk, int prior_fackets, u32 prior_snd_una,
+    int *acked, void *sack_state, struct skb_mstamp *now);
 int ptcp_rx_handle_tcp_urg(struct sock *sk, struct sk_buff *skb, struct tcphdr *th);
 int ptcp_rx_handle_dummy(struct sock *sk, struct sk_buff *skb);
 int ptcp_rx_disable_coalesce(struct sock *sk, struct sk_buff *to,
diff --git a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.c b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.c
index 4b1b38a72..e9e6078bb 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.c
@@ -23,6 +23,20 @@ ptcp_impl_print_sock_skb(struct sock *sk, struct sk_buff *skb, char *dbg_str)
   }
 }
 
+int (*lnk_rx_do_clean) (struct sock *sk, int prior_fackets, u32 prior_snd_una,
+    int *acked, void *sack_state, struct skb_mstamp *now) = 0;
+EXPORT_SYMBOL(lnk_rx_do_clean);
+int ptcp_impl_rx_do_clean(struct sock *sk, int prior_fackets,
+    u32 prior_snd_una, int *acked, void *sack_state, struct skb_mstamp *now)
+{
+  if (lnk_rx_do_clean) {
+    return lnk_rx_do_clean(sk, prior_fackets, prior_snd_una, acked,
+        sack_state, now);
+  }
+
+  return -1;
+}
+
 int (*lnk_rx_handle_tcp_urg) (struct sock *sk, struct sk_buff *skb,
     struct tcphdr *th) = 0;
 EXPORT_SYMBOL(lnk_rx_handle_tcp_urg);
@@ -142,6 +156,7 @@ ptcp_impl_tx_adjust_urg(struct sock *sk, struct sk_buff *skb)
 
 struct ptcp_hook_list ptcp_hooks[NUM_PTCP_HOOKS] = {
   PTCP_HOOK_INIT(print_sock_skb, ptcp_impl_print_sock_skb),
+  PTCP_HOOK_INIT(rx_do_clean, ptcp_impl_rx_do_clean),
   PTCP_HOOK_INIT(rx_handle_tcp_urg, ptcp_impl_rx_handle_tcp_urg),
   PTCP_HOOK_INIT(rx_handle_dummy, ptcp_impl_rx_handle_dummy),
   PTCP_HOOK_INIT(rx_disable_coalesce, ptcp_impl_rx_disable_coalesce),
diff --git a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.h b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.h
index d35acbe32..7b5cd93a3 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/sme/ptcp_hooks_impl.h
@@ -25,6 +25,8 @@
 
 union ptcp_list_options {
   void (*print_sock_skb) (struct sock *sk, struct sk_buff *skb, char *dbg_str);
+  int (*rx_do_clean) (struct sock *sk, int prior_fackets, u32 prior_snd_una,
+      int *acked, void *sack_state, struct skb_mstamp *now);
   int (*rx_handle_tcp_urg) (struct sock *sk, struct sk_buff *skb, struct tcphdr *th);
   int (*rx_handle_dummy) (struct sock *sk, struct sk_buff *skb);
   int (*rx_disable_coalesce) (struct sock *sk, struct sk_buff *to,
@@ -41,6 +43,7 @@ union ptcp_list_options {
 
 struct ptcp_hook_heads {
   struct list_head print_sock_skb;
+  struct list_head rx_do_clean;
   struct list_head rx_handle_tcp_urg;
   struct list_head rx_handle_dummy;
   struct list_head rx_disable_coalesce;
@@ -62,7 +65,7 @@ struct ptcp_hook_list {
 { .head = &ptcp_hook_heads.HEAD, .hook = { . HEAD = HOOK } }
 
 // increment this every time a new hook is added
-#define NUM_PTCP_HOOKS  10
+#define NUM_PTCP_HOOKS  11
 
 extern struct ptcp_hook_heads ptcp_hook_heads;
 extern struct ptcp_hook_list ptcp_hooks[NUM_PTCP_HOOKS];
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 2c705cfbd..c8ae8939e 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -3468,6 +3468,17 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
 	bool rtt_update;
 	int flag = 0;
 
+#if defined(CONFIG_XEN_SME) && defined(CONFIG_PACER_TCP)
+  char dbg[256];
+  int rskb = 0;
+  int ptcp_ret = ptcp_rx_do_clean(sk, prior_fackets, prior_snd_una, acked,
+      (void *) sack, now);
+  if (ptcp_ret == 0) {
+    return ptcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una, acked,
+        sack, now);
+  }
+#endif
+
 	first_ackt.v64 = 0;
 
 	while ((skb = tcp_write_queue_head(sk)) && skb != tcp_send_head(sk)) {
@@ -4042,18 +4053,18 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
 	if (!prior_packets)
 		goto no_queue;
 
-#if defined(CONFIG_XEN_SME) && defined(CONFIG_PACER_TCP)
-  if (lnk_rxtx_sync_shared_seq) {
-    flag |= ptcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una, &acked,
-        &sack_state, &now);
-  } else {
-#endif
+//#if defined(CONFIG_XEN_SME) && defined(CONFIG_PACER_TCP)
+//  if (lnk_rxtx_sync_shared_seq) {
+//    flag |= ptcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una, &acked,
+//        &sack_state, &now);
+//  } else {
+//#endif
 	/* See if we can take anything off of the retransmit queue. */
 	flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una, &acked,
 				    &sack_state, &now);
-#if defined(CONFIG_XEN_SME) && defined(CONFIG_PACER_TCP)
-  }
-#endif /* CONFIG_XEN_SME && CONFIG_PACER_TCP */
+//#if defined(CONFIG_XEN_SME) && defined(CONFIG_PACER_TCP)
+//  }
+//#endif /* CONFIG_XEN_SME && CONFIG_PACER_TCP */
 
 	if (tcp_ack_is_dubious(sk, flag)) {
 		is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP));
-- 
GitLab