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