nfp: tls: ignore queue limits for delete commands
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 9 Jul 2019 02:53:08 +0000 (19:53 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Jul 2019 03:21:09 +0000 (20:21 -0700)
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.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/ccm.h
drivers/net/ethernet/netronome/nfp/ccm_mbox.c
drivers/net/ethernet/netronome/nfp/crypto/tls.c

index da1b1e2..a460c75 100644 (file)
@@ -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,
index 02fccd9..d160ac7 100644 (file)
@@ -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 @@ err_free_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;
 
index 9f7ccb7..086bea0 100644 (file)
@@ -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;