* [PATCH] s390: uv: Fix loop condition in uv_find_secrets
@ 2026-08-11 8:43 Steffen Eiden
2026-08-11 15:34 ` Claudio Imbrenda
2026-08-12 7:30 ` Christoph Schlameuss
0 siblings, 2 replies; 3+ messages in thread
From: Steffen Eiden @ 2026-08-11 8:43 UTC (permalink / raw)
To: Christian Borntraeger, Janosch Frank, Claudio Imbrenda
Cc: David Hildenbrand, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Harald Freudenberger, kvm, linux-s390, linux-kernel,
Steffen Eiden
Nothing modified `start_idx` between the assignment and the comparison,
so the condition was always false and the do/while ran exactly once
even when the UV returned UVC_RC_MORE_DATA. Systems with more than
85 UV secrets got -ENOENT for any secret past the first page.
Fix this by setting the start index at the beginning of the loop not at
the end. First test if there are more secrets left by comparing
start_idx with list->next_secret_idx, and then set the start index to the
next secret index.
Fixes: 7c9137af2042 ("s390/uv: Retrieve UV secrets support")
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
arch/s390/kernel/uv.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index a284f98d9716..d970b15ef126 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -781,11 +781,14 @@ int uv_find_secret(const u8 secret_id[UV_SECRET_ID_LEN],
struct uv_secret_list *list,
struct uv_secret_list_item_hdr *secret)
{
- u16 start_idx = 0;
+ u16 start_idx;
u16 list_rc;
int ret;
+ list->next_secret_idx = 0;
+
do {
+ start_idx = list->next_secret_idx;
uv_list_secrets(list, start_idx, &list_rc, NULL);
if (list_rc != UVC_RC_EXECUTED && list_rc != UVC_RC_MORE_DATA) {
if (list_rc == UVC_RC_INV_CMD)
@@ -796,7 +799,6 @@ int uv_find_secret(const u8 secret_id[UV_SECRET_ID_LEN],
ret = find_secret_in_page(secret_id, list, secret);
if (ret == 0)
return ret;
- start_idx = list->next_secret_idx;
} while (list_rc == UVC_RC_MORE_DATA && start_idx < list->next_secret_idx);
return -ENOENT;
---
base-commit: d58772d8520c7ef247c4b95c9bd76d3a25da9ff5
change-id: 20260811-uv_secrets_fix-58a63b4a4ec4
Best regards,
--
Steffen Eiden <seiden@linux.ibm.com>
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH] s390: uv: Fix loop condition in uv_find_secrets
2026-08-11 8:43 [PATCH] s390: uv: Fix loop condition in uv_find_secrets Steffen Eiden
@ 2026-08-11 15:34 ` Claudio Imbrenda
2026-08-12 7:30 ` Christoph Schlameuss
1 sibling, 0 replies; 3+ messages in thread
From: Claudio Imbrenda @ 2026-08-11 15:34 UTC (permalink / raw)
To: Steffen Eiden
Cc: Christian Borntraeger, Janosch Frank, David Hildenbrand,
Heiko Carstens, Vasily Gorbik, Alexander Gordeev, Sven Schnelle,
Christoph Schlameuss, Harald Freudenberger, kvm, linux-s390,
linux-kernel
On Tue, 11 Aug 2026 10:43:52 +0200
Steffen Eiden <seiden@linux.ibm.com> wrote:
> Nothing modified `start_idx` between the assignment and the comparison,
> so the condition was always false and the do/while ran exactly once
> even when the UV returned UVC_RC_MORE_DATA. Systems with more than
> 85 UV secrets got -ENOENT for any secret past the first page.
>
> Fix this by setting the start index at the beginning of the loop not at
> the end. First test if there are more secrets left by comparing
> start_idx with list->next_secret_idx, and then set the start index to the
> next secret index.
>
> Fixes: 7c9137af2042 ("s390/uv: Retrieve UV secrets support")
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> ---
> arch/s390/kernel/uv.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
> index a284f98d9716..d970b15ef126 100644
> --- a/arch/s390/kernel/uv.c
> +++ b/arch/s390/kernel/uv.c
> @@ -781,11 +781,14 @@ int uv_find_secret(const u8 secret_id[UV_SECRET_ID_LEN],
> struct uv_secret_list *list,
> struct uv_secret_list_item_hdr *secret)
> {
> - u16 start_idx = 0;
> + u16 start_idx;
> u16 list_rc;
> int ret;
>
> + list->next_secret_idx = 0;
> +
> do {
> + start_idx = list->next_secret_idx;
> uv_list_secrets(list, start_idx, &list_rc, NULL);
> if (list_rc != UVC_RC_EXECUTED && list_rc != UVC_RC_MORE_DATA) {
> if (list_rc == UVC_RC_INV_CMD)
> @@ -796,7 +799,6 @@ int uv_find_secret(const u8 secret_id[UV_SECRET_ID_LEN],
> ret = find_secret_in_page(secret_id, list, secret);
> if (ret == 0)
> return ret;
> - start_idx = list->next_secret_idx;
> } while (list_rc == UVC_RC_MORE_DATA && start_idx < list->next_secret_idx);
>
> return -ENOENT;
>
> ---
> base-commit: d58772d8520c7ef247c4b95c9bd76d3a25da9ff5
> change-id: 20260811-uv_secrets_fix-58a63b4a4ec4
>
> Best regards,
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] s390: uv: Fix loop condition in uv_find_secrets
2026-08-11 8:43 [PATCH] s390: uv: Fix loop condition in uv_find_secrets Steffen Eiden
2026-08-11 15:34 ` Claudio Imbrenda
@ 2026-08-12 7:30 ` Christoph Schlameuss
1 sibling, 0 replies; 3+ messages in thread
From: Christoph Schlameuss @ 2026-08-12 7:30 UTC (permalink / raw)
To: Steffen Eiden, Christian Borntraeger, Janosch Frank,
Claudio Imbrenda
Cc: David Hildenbrand, Heiko Carstens, Vasily Gorbik,
Alexander Gordeev, Sven Schnelle, Christoph Schlameuss,
Harald Freudenberger, kvm, linux-s390, linux-kernel
On Tue Aug 11, 2026 at 10:43 AM CEST, Steffen Eiden wrote:
> Nothing modified `start_idx` between the assignment and the comparison,
> so the condition was always false and the do/while ran exactly once
> even when the UV returned UVC_RC_MORE_DATA. Systems with more than
> 85 UV secrets got -ENOENT for any secret past the first page.
>
> Fix this by setting the start index at the beginning of the loop not at
> the end. First test if there are more secrets left by comparing
> start_idx with list->next_secret_idx, and then set the start index to the
> next secret index.
>
> Fixes: 7c9137af2042 ("s390/uv: Retrieve UV secrets support")
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
> ---
> arch/s390/kernel/uv.c | 6 ++++--
> 1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
> index a284f98d9716..d970b15ef126 100644
> --- a/arch/s390/kernel/uv.c
> +++ b/arch/s390/kernel/uv.c
> @@ -781,11 +781,14 @@ int uv_find_secret(const u8 secret_id[UV_SECRET_ID_LEN],
> struct uv_secret_list *list,
> struct uv_secret_list_item_hdr *secret)
> {
> - u16 start_idx = 0;
> + u16 start_idx;
> u16 list_rc;
> int ret;
>
> + list->next_secret_idx = 0;
> +
> do {
> + start_idx = list->next_secret_idx;
> uv_list_secrets(list, start_idx, &list_rc, NULL);
> if (list_rc != UVC_RC_EXECUTED && list_rc != UVC_RC_MORE_DATA) {
> if (list_rc == UVC_RC_INV_CMD)
> @@ -796,7 +799,6 @@ int uv_find_secret(const u8 secret_id[UV_SECRET_ID_LEN],
> ret = find_secret_in_page(secret_id, list, secret);
> if (ret == 0)
> return ret;
> - start_idx = list->next_secret_idx;
> } while (list_rc == UVC_RC_MORE_DATA && start_idx < list->next_secret_idx);
>
> return -ENOENT;
>
> ---
> base-commit: d58772d8520c7ef247c4b95c9bd76d3a25da9ff5
> change-id: 20260811-uv_secrets_fix-58a63b4a4ec4
>
> Best regards,
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-08-12 7:30 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-11 8:43 [PATCH] s390: uv: Fix loop condition in uv_find_secrets Steffen Eiden
2026-08-11 15:34 ` Claudio Imbrenda
2026-08-12 7:30 ` Christoph Schlameuss
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.