Re: [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1)
Peter Zijlstra <[email protected]> Fri, 31 Jul 2026 10:40:27 +0200
| Newsgroups | org.kernel.vger.linux-crypto,org.kernel.vger.linux-kernel,org.kernel.vger.linux-s390 |
|---|---|
| Message-ID | <[email protected]> |
On Fri, Jul 31, 2026 at 09:44:57AM +0200, Holger Dengler wrote:
> > Yes, guest migration is very likely far more disruptive than most
> > anything else. Perhaps clarify the code comment to include some of this
> > explanation?
>
> I agree, the comment is not telling all main key points. What about the
> following?
>
> /*
> * Protected key expired due to relocation to another
> * host. The long runnning re-wrap has no asynchronous
> * completion notification, so polling is required.
> * Trigger a re-schedule of this request by returning
> * -ENOSPC ("hardware queue full") to the crypto engine.
> * To avoid immediately re-invocation of this callback,
> * tell scheduler to voluntarily give up the CPU here.
> */
>
> (I would leave it up to Heiko to merge the comment in his series, or let
> Harald/me do it in a separate patch)
Right, perhaps something like so, avoiding the endless copy/paste ?
---
diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c
index 8cfe6166c193..973436592318 100644
--- a/arch/s390/crypto/paes_s390.c
+++ b/arch/s390/crypto/paes_s390.c
@@ -548,16 +548,7 @@ static int ecb_paes_do_one_request(struct crypto_engine *engine, void *areq)
rc = ecb_paes_do_crypt(ctx, req_ctx, tested, true);
if (rc == -EKEYEXPIRED) {
- /*
- * Protected key expired, conversion is in process.
- * Trigger a re-schedule of this request by returning
- * -ENOSPC ("hardware queue is full") to the crypto engine.
- * To avoid immediately re-invocation of this callback,
- * tell the scheduler to voluntarily give up the CPU here.
- */
- cond_resched();
- pr_debug("rescheduling request\n");
- return -ENOSPC;
+ return pkey_handle_expired();
} else if (rc) {
skcipher_walk_done(walk, rc);
}
@@ -814,16 +805,7 @@ static int cbc_paes_do_one_request(struct crypto_engine *engine, void *areq)
rc = cbc_paes_do_crypt(ctx, req_ctx, tested, true);
if (rc == -EKEYEXPIRED) {
- /*
- * Protected key expired, conversion is in process.
- * Trigger a re-schedule of this request by returning
- * -ENOSPC ("hardware queue is full") to the crypto engine.
- * To avoid immediately re-invocation of this callback,
- * tell the scheduler to voluntarily give up the CPU here.
- */
- cond_resched();
- pr_debug("rescheduling request\n");
- return -ENOSPC;
+ return pkey_handle_expired();
} else if (rc) {
skcipher_walk_done(walk, rc);
}
@@ -1122,16 +1104,7 @@ static int ctr_paes_do_one_request(struct crypto_engine *engine, void *areq)
rc = ctr_paes_do_crypt(ctx, req_ctx, tested, true);
if (rc == -EKEYEXPIRED) {
- /*
- * Protected key expired, conversion is in process.
- * Trigger a re-schedule of this request by returning
- * -ENOSPC ("hardware queue is full") to the crypto engine.
- * To avoid immediately re-invocation of this callback,
- * tell the scheduler to voluntarily give up the CPU here.
- */
- cond_resched();
- pr_debug("rescheduling request\n");
- return -ENOSPC;
+ return pkey_handle_expired();
} else if (rc) {
skcipher_walk_done(walk, rc);
}
@@ -1565,16 +1538,7 @@ static int xts_paes_do_one_request(struct crypto_engine *engine, void *areq)
rc = xts_paes_do_crypt(ctx, req_ctx, tested, true);
if (rc == -EKEYEXPIRED) {
- /*
- * Protected key expired, conversion is in process.
- * Trigger a re-schedule of this request by returning
- * -ENOSPC ("hardware queue is full") to the crypto engine.
- * To avoid immediately re-invocation of this callback,
- * tell the scheduler to voluntarily give up the CPU here.
- */
- cond_resched();
- pr_debug("rescheduling request\n");
- return -ENOSPC;
+ return pkey_handle_expired();
} else if (rc) {
skcipher_walk_done(walk, rc);
}
diff --git a/arch/s390/crypto/phmac_s390.c b/arch/s390/crypto/phmac_s390.c
index 03ca33ffe6cc..020a1beb2e22 100644
--- a/arch/s390/crypto/phmac_s390.c
+++ b/arch/s390/crypto/phmac_s390.c
@@ -887,16 +887,7 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)
case OP_FINUP:
rc = phmac_kmac_update(req, true);
if (rc == -EKEYEXPIRED) {
- /*
- * Protected key expired, conversion is in process.
- * Trigger a re-schedule of this request by returning
- * -ENOSPC ("hardware queue full") to the crypto engine.
- * To avoid immediately re-invocation of this callback,
- * tell scheduler to voluntarily give up the CPU here.
- */
- pr_debug("rescheduling request\n");
- cond_resched();
- return -ENOSPC;
+ return pkey_handle_expired();
} else if (rc) {
hwh_advance(hwh, rc);
goto out;
@@ -907,18 +898,8 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)
fallthrough;
case OP_FINAL:
rc = phmac_kmac_final(req, true);
- if (rc == -EKEYEXPIRED) {
- /*
- * Protected key expired, conversion is in process.
- * Trigger a re-schedule of this request by returning
- * -ENOSPC ("hardware queue full") to the crypto engine.
- * To avoid immediately re-invocation of this callback,
- * tell scheduler to voluntarily give up the CPU here.
- */
- pr_debug("rescheduling request\n");
- cond_resched();
- return -ENOSPC;
- }
+ if (rc == -EKEYEXPIRED)
+ return pkey_handle_expired();
break;
default:
/* unknown/unsupported/unimplemented asynch op */
diff --git a/arch/s390/include/asm/pkey.h b/arch/s390/include/asm/pkey.h
index 0af5ac4f646b..9c5f31b50bc8 100644
--- a/arch/s390/include/asm/pkey.h
+++ b/arch/s390/include/asm/pkey.h
@@ -13,6 +13,7 @@
#include <linux/ioctl.h>
#include <linux/types.h>
+#include <linux/delay.h>
#include <uapi/asm/pkey.h>
/*
@@ -44,4 +45,20 @@ int pkey_key2protkey(const u8 *key, u32 keylen,
*/
#define PKEY_XFLAG_NOCLEARKEY 0x0002
+static inline int pkey_handle_expired(void)
+{
+ /*
+ * Protected key expired due to relocation to another
+ * host. The long runnning re-wrap has no asynchronous
+ * completion notification, so polling is required.
+ * Trigger a re-schedule of this request by returning
+ * -ENOSPC ("hardware queue full") to the crypto engine.
+ * To avoid immediately re-invocation of this callback,
+ * tell scheduler to voluntarily give up the CPU here.
+ */
+ msleep(1);
+ pr_debug("rescheduling request\n");
+ return -ENOSPC;
+}
+
#endif /* _KAPI_PKEY_H */