| From bc16efd2430652f894ae34b1de5eccc3bf0d2810 Mon Sep 17 00:00:00 2001 |
| From: Vinay Kumar Yadav <vinay.yadav@chelsio.com> |
| Date: Thu, 15 Apr 2021 13:17:46 +0530 |
| Subject: ch_ktls: fix device connection close |
| |
| From: Vinay Kumar Yadav <vinay.yadav@chelsio.com> |
| |
| commit bc16efd2430652f894ae34b1de5eccc3bf0d2810 upstream. |
| |
| When sge queue is full and chcr_ktls_xmit_wr_complete() |
| returns failure, skb is not freed if it is not the last tls record in |
| this skb, causes refcount never gets freed and tls_dev_del() |
| never gets called on this connection. |
| |
| Fixes: 5a4b9fe7fece ("cxgb4/chcr: complete record tx handling") |
| Signed-off-by: Vinay Kumar Yadav <vinay.yadav@chelsio.com> |
| Signed-off-by: Rohit Maheshwari <rohitm@chelsio.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| --- a/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c |
| +++ b/drivers/net/ethernet/chelsio/inline_crypto/ch_ktls/chcr_ktls.c |
| @@ -1740,7 +1740,9 @@ static int chcr_end_part_handler(struct |
| struct sge_eth_txq *q, u32 skb_offset, |
| u32 tls_end_offset, bool last_wr) |
| { |
| + bool free_skb_if_tx_fails = false; |
| struct sk_buff *nskb = NULL; |
| + |
| /* check if it is a complete record */ |
| if (tls_end_offset == record->len) { |
| nskb = skb; |
| @@ -1763,6 +1765,8 @@ static int chcr_end_part_handler(struct |
| |
| if (last_wr) |
| dev_kfree_skb_any(skb); |
| + else |
| + free_skb_if_tx_fails = true; |
| |
| last_wr = true; |
| |
| @@ -1774,6 +1778,8 @@ static int chcr_end_part_handler(struct |
| record->num_frags, |
| (last_wr && tcp_push_no_fin), |
| mss)) { |
| + if (free_skb_if_tx_fails) |
| + dev_kfree_skb_any(skb); |
| goto out; |
| } |
| tx_info->prev_seq = record->end_seq; |