We need to do our best not to drop delete commands, otherwise
we will have stale entries in the connection table.  Ignore
the control message queue limits for delete commands.

Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vanderme...@netronome.com>
---
 drivers/net/ethernet/netronome/nfp/ccm.h      |  4 +++
 drivers/net/ethernet/netronome/nfp/ccm_mbox.c | 25 +++++++++++++------
 .../net/ethernet/netronome/nfp/crypto/tls.c   |  5 ++--
 3 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/ccm.h 
b/drivers/net/ethernet/netronome/nfp/ccm.h
index da1b1e20df51..a460c75522be 100644
--- a/drivers/net/ethernet/netronome/nfp/ccm.h
+++ b/drivers/net/ethernet/netronome/nfp/ccm.h
@@ -118,6 +118,10 @@ bool nfp_ccm_mbox_fits(struct nfp_net *nn, unsigned int 
size);
 struct sk_buff *
 nfp_ccm_mbox_msg_alloc(struct nfp_net *nn, unsigned int req_size,
                       unsigned int reply_size, gfp_t flags);
+int __nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb,
+                              enum nfp_ccm_type type,
+                              unsigned int reply_size,
+                              unsigned int max_reply_size, bool critical);
 int nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb,
                             enum nfp_ccm_type type,
                             unsigned int reply_size,
diff --git a/drivers/net/ethernet/netronome/nfp/ccm_mbox.c 
b/drivers/net/ethernet/netronome/nfp/ccm_mbox.c
index 02fccd90961d..d160ac794d98 100644
--- a/drivers/net/ethernet/netronome/nfp/ccm_mbox.c
+++ b/drivers/net/ethernet/netronome/nfp/ccm_mbox.c
@@ -515,13 +515,13 @@ nfp_ccm_mbox_msg_prepare(struct nfp_net *nn, struct 
sk_buff *skb,
 
 static int
 nfp_ccm_mbox_msg_enqueue(struct nfp_net *nn, struct sk_buff *skb,
-                        enum nfp_ccm_type type)
+                        enum nfp_ccm_type type, bool critical)
 {
        struct nfp_ccm_hdr *hdr;
 
        assert_spin_locked(&nn->mbox_cmsg.queue.lock);
 
-       if (nn->mbox_cmsg.queue.qlen >= NFP_CCM_MAX_QLEN) {
+       if (!critical && nn->mbox_cmsg.queue.qlen >= NFP_CCM_MAX_QLEN) {
                nn_dp_warn(&nn->dp, "mailbox request queue too long\n");
                return -EBUSY;
        }
@@ -536,10 +536,10 @@ nfp_ccm_mbox_msg_enqueue(struct nfp_net *nn, struct 
sk_buff *skb,
        return 0;
 }
 
-int nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb,
-                            enum nfp_ccm_type type,
-                            unsigned int reply_size,
-                            unsigned int max_reply_size)
+int __nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb,
+                              enum nfp_ccm_type type,
+                              unsigned int reply_size,
+                              unsigned int max_reply_size, bool critical)
 {
        int err;
 
@@ -550,7 +550,7 @@ int nfp_ccm_mbox_communicate(struct nfp_net *nn, struct 
sk_buff *skb,
 
        spin_lock_bh(&nn->mbox_cmsg.queue.lock);
 
-       err = nfp_ccm_mbox_msg_enqueue(nn, skb, type);
+       err = nfp_ccm_mbox_msg_enqueue(nn, skb, type, critical);
        if (err)
                goto err_unlock;
 
@@ -594,6 +594,15 @@ int nfp_ccm_mbox_communicate(struct nfp_net *nn, struct 
sk_buff *skb,
        return err;
 }
 
+int nfp_ccm_mbox_communicate(struct nfp_net *nn, struct sk_buff *skb,
+                            enum nfp_ccm_type type,
+                            unsigned int reply_size,
+                            unsigned int max_reply_size)
+{
+       return __nfp_ccm_mbox_communicate(nn, skb, type, reply_size,
+                                         max_reply_size, false);
+}
+
 static void nfp_ccm_mbox_post_runq_work(struct work_struct *work)
 {
        struct sk_buff *skb;
@@ -650,7 +659,7 @@ int nfp_ccm_mbox_post(struct nfp_net *nn, struct sk_buff 
*skb,
 
        spin_lock_bh(&nn->mbox_cmsg.queue.lock);
 
-       err = nfp_ccm_mbox_msg_enqueue(nn, skb, type);
+       err = nfp_ccm_mbox_msg_enqueue(nn, skb, type, false);
        if (err)
                goto err_unlock;
 
diff --git a/drivers/net/ethernet/netronome/nfp/crypto/tls.c 
b/drivers/net/ethernet/netronome/nfp/crypto/tls.c
index 9f7ccb7da417..086bea0a7f2d 100644
--- a/drivers/net/ethernet/netronome/nfp/crypto/tls.c
+++ b/drivers/net/ethernet/netronome/nfp/crypto/tls.c
@@ -112,8 +112,9 @@ nfp_net_tls_communicate_simple(struct nfp_net *nn, struct 
sk_buff *skb,
        struct nfp_crypto_reply_simple *reply;
        int err;
 
-       err = nfp_ccm_mbox_communicate(nn, skb, type,
-                                      sizeof(*reply), sizeof(*reply));
+       err = __nfp_ccm_mbox_communicate(nn, skb, type,
+                                        sizeof(*reply), sizeof(*reply),
+                                        type == NFP_CCM_TYPE_CRYPTO_DEL);
        if (err) {
                nn_dp_warn(&nn->dp, "failed to %s TLS: %d\n", name, err);
                return err;
-- 
2.21.0

Reply via email to