* [PATCH v3 0/4] s390: Remove or replace cond_resched() calls
@ 2026-07-30 5:29 Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1) Heiko Carstens
` (3 more replies)
0 siblings, 4 replies; 8+ messages in thread
From: Heiko Carstens @ 2026-07-30 5:29 UTC (permalink / raw)
To: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
Claudio Imbrenda, David Hildenbrand, Peter Zijlstra, Herbert Xu
Cc: linux-s390, linux-kernel, linux-crypto
v3:
- Drop uv_call_sched() [Claudio Imbrenda]
v2:
- Use msleep() in crypto code (Holger Dengler)
- Add Reviewed-by tag from Peter Oberparleiter
v1:
Since [1] it is only possible to select the PREEMPT or PREEMPT_LAZY
preemption models for s390. This has caused some minor problems, but
everything has been addressed.
Given that for both preemption models cond_resched() is a no-op remove
or replace it everywhere.
[1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
Heiko Carstens (4):
s390/crypto: Replace cond_resched() with msleep(1)
KVM: s390: Remove cond_resched() calls
s390: Remove cond_resched() calls
s390/cio: Remove cond_resched() calls
arch/s390/crypto/paes_s390.c | 8 ++++----
arch/s390/crypto/phmac_s390.c | 4 ++--
arch/s390/include/asm/uv.h | 16 ++--------------
arch/s390/kernel/perf_cpum_cf.c | 1 -
arch/s390/kernel/uv.c | 2 +-
arch/s390/kvm/gaccess.c | 8 ++------
arch/s390/kvm/gmap.c | 4 ----
arch/s390/kvm/kvm-s390.c | 1 -
arch/s390/kvm/pv.c | 11 +++++------
arch/s390/kvm/vsie.c | 1 -
arch/s390/mm/cmm.c | 2 --
arch/s390/mm/gmap_helpers.c | 1 -
arch/s390/mm/pageattr.c | 5 -----
arch/s390/mm/pgalloc.c | 1 -
arch/s390/pci/pci.c | 4 +---
drivers/s390/char/uvdevice.c | 6 +++---
drivers/s390/cio/css.c | 8 --------
17 files changed, 20 insertions(+), 63 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1)
2026-07-30 5:29 [PATCH v3 0/4] s390: Remove or replace cond_resched() calls Heiko Carstens
@ 2026-07-30 5:29 ` Heiko Carstens
2026-07-30 7:47 ` Holger Dengler
2026-07-30 10:11 ` Peter Zijlstra
2026-07-30 5:29 ` [PATCH v3 2/4] KVM: s390: Remove cond_resched() calls Heiko Carstens
` (2 subsequent siblings)
3 siblings, 2 replies; 8+ messages in thread
From: Heiko Carstens @ 2026-07-30 5:29 UTC (permalink / raw)
To: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
Claudio Imbrenda, David Hildenbrand, Peter Zijlstra, Herbert Xu
Cc: linux-s390, linux-kernel, linux-crypto
With [1] cond_resched() is always compiled away and becomes a no-op.
The comments for all cond_resched() calls in crypto code however indicate
that the current process should be scheduled away to avoid instant
re-invocation of a callback. This is not what cond_resched() would do or
did.
Instead of just removing the cond_resched() calls, replace them with
msleep() calls, as suggested by Holger Dengler. This forces the current
task to be scheduled away (sleeps) like originally intended.
[1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
arch/s390/crypto/paes_s390.c | 8 ++++----
arch/s390/crypto/phmac_s390.c | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c
index 8cfe6166c193..511cb6105436 100644
--- a/arch/s390/crypto/paes_s390.c
+++ b/arch/s390/crypto/paes_s390.c
@@ -555,7 +555,7 @@ static int ecb_paes_do_one_request(struct crypto_engine *engine, void *areq)
* To avoid immediately re-invocation of this callback,
* tell the scheduler to voluntarily give up the CPU here.
*/
- cond_resched();
+ msleep(1);
pr_debug("rescheduling request\n");
return -ENOSPC;
} else if (rc) {
@@ -821,7 +821,7 @@ static int cbc_paes_do_one_request(struct crypto_engine *engine, void *areq)
* To avoid immediately re-invocation of this callback,
* tell the scheduler to voluntarily give up the CPU here.
*/
- cond_resched();
+ msleep(1);
pr_debug("rescheduling request\n");
return -ENOSPC;
} else if (rc) {
@@ -1129,7 +1129,7 @@ static int ctr_paes_do_one_request(struct crypto_engine *engine, void *areq)
* To avoid immediately re-invocation of this callback,
* tell the scheduler to voluntarily give up the CPU here.
*/
- cond_resched();
+ msleep(1);
pr_debug("rescheduling request\n");
return -ENOSPC;
} else if (rc) {
@@ -1572,7 +1572,7 @@ static int xts_paes_do_one_request(struct crypto_engine *engine, void *areq)
* To avoid immediately re-invocation of this callback,
* tell the scheduler to voluntarily give up the CPU here.
*/
- cond_resched();
+ msleep(1);
pr_debug("rescheduling request\n");
return -ENOSPC;
} else if (rc) {
diff --git a/arch/s390/crypto/phmac_s390.c b/arch/s390/crypto/phmac_s390.c
index 03ca33ffe6cc..da76c7beb184 100644
--- a/arch/s390/crypto/phmac_s390.c
+++ b/arch/s390/crypto/phmac_s390.c
@@ -895,7 +895,7 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)
* tell scheduler to voluntarily give up the CPU here.
*/
pr_debug("rescheduling request\n");
- cond_resched();
+ msleep(1);
return -ENOSPC;
} else if (rc) {
hwh_advance(hwh, rc);
@@ -916,7 +916,7 @@ static int phmac_do_one_request(struct crypto_engine *engine, void *areq)
* tell scheduler to voluntarily give up the CPU here.
*/
pr_debug("rescheduling request\n");
- cond_resched();
+ msleep(1);
return -ENOSPC;
}
break;
--
2.53.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v3 2/4] KVM: s390: Remove cond_resched() calls
2026-07-30 5:29 [PATCH v3 0/4] s390: Remove or replace cond_resched() calls Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1) Heiko Carstens
@ 2026-07-30 5:29 ` Heiko Carstens
2026-07-30 8:51 ` Claudio Imbrenda
2026-07-30 5:29 ` [PATCH v3 3/4] " Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 4/4] s390/cio: " Heiko Carstens
3 siblings, 1 reply; 8+ messages in thread
From: Heiko Carstens @ 2026-07-30 5:29 UTC (permalink / raw)
To: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
Claudio Imbrenda, David Hildenbrand, Peter Zijlstra, Herbert Xu
Cc: linux-s390, linux-kernel, linux-crypto
Since [1] cond_resched() is a no-op on s390. Remove all calls.
This also entirely removes uv_call_sched() and replaces all call sites
with uv_call(), since both functions are identical after the removal
of cond_resched().
[1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
arch/s390/include/asm/uv.h | 16 ++--------------
arch/s390/kernel/uv.c | 2 +-
arch/s390/kvm/gaccess.c | 8 ++------
arch/s390/kvm/gmap.c | 4 ----
arch/s390/kvm/kvm-s390.c | 1 -
arch/s390/kvm/pv.c | 11 +++++------
arch/s390/kvm/vsie.c | 1 -
arch/s390/mm/gmap_helpers.c | 1 -
drivers/s390/char/uvdevice.c | 6 +++---
9 files changed, 13 insertions(+), 37 deletions(-)
diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
index d919e69662f5..89c9bb56c7e6 100644
--- a/arch/s390/include/asm/uv.h
+++ b/arch/s390/include/asm/uv.h
@@ -454,18 +454,6 @@ static inline int uv_call(unsigned long r1, unsigned long r2)
return cc;
}
-/* Low level uv_call that avoids stalls for long running busy conditions */
-static inline int uv_call_sched(unsigned long r1, unsigned long r2)
-{
- int cc;
-
- do {
- cc = __uv_call(r1, r2);
- cond_resched();
- } while (cc > 1);
- return cc;
-}
-
/*
* special variant of uv_call that only transports the cpu or guest
* handle and the command, like destroy or verify.
@@ -480,7 +468,7 @@ static inline int uv_cmd_nodata(u64 handle, u16 cmd, u16 *rc, u16 *rrc)
int cc;
WARN(!handle, "No handle provided to Ultravisor call cmd %x\n", cmd);
- cc = uv_call_sched(0, (u64)&uvcb);
+ cc = uv_call(0, (u64)&uvcb);
*rc = uvcb.header.rc;
*rrc = uvcb.header.rrc;
return cc ? -EINVAL : 0;
@@ -518,7 +506,7 @@ static inline int uv_list_secrets(struct uv_secret_list *buf, u16 start_idx,
.start_idx = start_idx,
.list_addr = (u64)buf,
};
- int cc = uv_call_sched(0, (u64)&uvcb);
+ int cc = uv_call(0, (u64)&uvcb);
if (rc)
*rc = uvcb.header.rc;
diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index a284f98d9716..62841bb00a26 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -831,7 +831,7 @@ int uv_retrieve_secret(u16 secret_idx, u8 *buf, size_t buf_size)
.buf_size = buf_size,
};
- uv_call_sched(0, (u64)&uvcb);
+ uv_call(0, (u64)&uvcb);
switch (uvcb.header.rc) {
case UVC_RC_EXECUTED:
diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
index 36102b2727fb..0d389a302a70 100644
--- a/arch/s390/kvm/gaccess.c
+++ b/arch/s390/kvm/gaccess.c
@@ -151,10 +151,8 @@ static void ipte_lock_simple(struct kvm *kvm)
ic = &kvm->arch.sca->ipte_control;
old = READ_ONCE(*ic);
do {
- if (old.k) {
- cond_resched();
+ if (old.k)
goto retry;
- }
new = old;
new.k = 1;
} while (!try_cmpxchg(&ic->val, &old.val, new.val));
@@ -189,10 +187,8 @@ static void ipte_lock_siif(struct kvm *kvm)
ic = &kvm->arch.sca->ipte_control;
old = READ_ONCE(*ic);
do {
- if (old.kg) {
- cond_resched();
+ if (old.kg)
goto retry;
- }
new = old;
new.k = 1;
new.kh++;
diff --git a/arch/s390/kvm/gmap.c b/arch/s390/kvm/gmap.c
index 8abb4f55b306..3758e4009709 100644
--- a/arch/s390/kvm/gmap.c
+++ b/arch/s390/kvm/gmap.c
@@ -941,7 +941,6 @@ void gmap_split_huge_pages(struct gmap *gmap)
scoped_guard(read_lock, &gmap->kvm->mmu_lock)
start = _dat_walk_gfn_range(start, asce_end(gmap->asce), gmap->asce,
&ops, DAT_WALK_IGN_HOLES, gmap);
- cond_resched();
} while (start);
}
@@ -963,7 +962,6 @@ static int _gmap_enable_skeys(struct gmap *gmap)
do {
scoped_guard(write_lock, &gmap->kvm->mmu_lock)
start = dat_reset_skeys(gmap->asce, start);
- cond_resched();
} while (start);
return 0;
}
@@ -1019,7 +1017,6 @@ int gmap_pv_destroy_range(struct gmap *gmap, gfn_t start, gfn_t end, bool interr
DAT_WALK_IGN_HOLES, NULL);
if (interruptible && fatal_signal_pending(current))
return -EINTR;
- cond_resched();
} while (start && start < end);
return 0;
}
@@ -1138,7 +1135,6 @@ void _gmap_set_cmma_all(struct gmap *gmap, bool dirty)
gfn = _dat_walk_gfn_range(gfn, asce_end(gmap->asce), gmap->asce, &ops,
DAT_WALK_IGN_HOLES,
&gmap->kvm->arch.cmma_dirty_pages);
- cond_resched();
} while (gfn);
}
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index 150b5dd2170e..2ede8f035a38 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -1027,7 +1027,6 @@ static int kvm_s390_set_mem_control(struct kvm *kvm, struct kvm_device_attr *att
do {
scoped_guard(read_lock, &kvm->mmu_lock)
start_gfn = dat_reset_cmma(kvm->arch.gmap->asce, start_gfn);
- cond_resched();
} while (start_gfn);
ret = 0;
break;
diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
index 1beacc841ca8..54c17ddb6b11 100644
--- a/arch/s390/kvm/pv.c
+++ b/arch/s390/kvm/pv.c
@@ -429,7 +429,7 @@ static int kvm_s390_pv_deinit_vm_fast(struct kvm *kvm, u16 *rc, u16 *rrc)
};
int cc;
- cc = uv_call_sched(0, (u64)&uvcb);
+ cc = uv_call(0, (u64)&uvcb);
if (rc)
*rc = uvcb.header.rc;
if (rrc)
@@ -746,7 +746,7 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
}
gmap_split_huge_pages(kvm->arch.gmap);
- cc = uv_call_sched(0, (u64)&uvcb);
+ cc = uv_call(0, (u64)&uvcb);
*rc = uvcb.header.rc;
*rrc = uvcb.header.rrc;
KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x",
@@ -832,7 +832,6 @@ int kvm_s390_pv_unpack(struct kvm *kvm, unsigned long addr, unsigned long size,
while (offset < size) {
ret = unpack_one(kvm, addr, tweak, offset, rc, rrc);
if (ret == -EAGAIN) {
- cond_resched();
if (fatal_signal_pending(current))
break;
continue;
@@ -875,7 +874,7 @@ int kvm_s390_pv_dump_cpu(struct kvm_vcpu *vcpu, void *buff, u16 *rc, u16 *rrc)
};
int cc;
- cc = uv_call_sched(0, (u64)&uvcb);
+ cc = uv_call(0, (u64)&uvcb);
*rc = uvcb.header.rc;
*rrc = uvcb.header.rrc;
return cc;
@@ -959,7 +958,7 @@ int kvm_s390_pv_dump_stor_state(struct kvm *kvm, void __user *buff_user,
/* We will loop until the user buffer is filled or an error occurs */
do {
/* Get 1MB worth of guest storage state data */
- cc = uv_call_sched(0, (u64)&uvcb);
+ cc = uv_call(0, (u64)&uvcb);
/* All or nothing */
if (cc) {
@@ -1037,7 +1036,7 @@ int kvm_s390_pv_dump_complete(struct kvm *kvm, void __user *buff_user,
return -ENOMEM;
complete.dump_area_origin = (u64)compl_data;
- ret = uv_call_sched(0, (u64)&complete);
+ ret = uv_call(0, (u64)&complete);
*rc = complete.header.rc;
*rrc = complete.header.rrc;
KVM_UV_EVENT(kvm, 3, "PROTVIRT DUMP COMPLETE: rc %x rrc %x",
diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
index eea24562e7db..6dcd3b110c17 100644
--- a/arch/s390/kvm/vsie.c
+++ b/arch/s390/kvm/vsie.c
@@ -1434,7 +1434,6 @@ static int vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
}
if (sg)
sg = gmap_put(sg);
- cond_resched();
}
if (sg)
sg = gmap_put(sg);
diff --git a/arch/s390/mm/gmap_helpers.c b/arch/s390/mm/gmap_helpers.c
index 4bf7c9012feb..d564cdefb90f 100644
--- a/arch/s390/mm/gmap_helpers.c
+++ b/arch/s390/mm/gmap_helpers.c
@@ -272,7 +272,6 @@ static int __gmap_helper_unshare_zeropages(struct mm_struct *mm)
* truncation. In that case, the shared zeropage would be gone
* and we can simply retry and make progress.
*/
- cond_resched();
goto retry;
}
diff --git a/drivers/s390/char/uvdevice.c b/drivers/s390/char/uvdevice.c
index e6a264c996ce..4d274a2ee84d 100644
--- a/drivers/s390/char/uvdevice.c
+++ b/drivers/s390/char/uvdevice.c
@@ -224,7 +224,7 @@ static int uvio_attestation(struct uvio_ioctl_cb *uv_ioctl)
if (ret)
goto out;
- uv_call_sched(0, (u64)uvcb_attest);
+ uv_call(0, (u64)uvcb_attest);
uv_ioctl->uv_rc = uvcb_attest->header.rc;
uv_ioctl->uv_rrc = uvcb_attest->header.rrc;
@@ -291,7 +291,7 @@ static int uvio_add_secret(struct uvio_ioctl_cb *uv_ioctl)
ret = 0;
uvcb.addr = (u64)asrcb;
- uv_call_sched(0, (u64)&uvcb);
+ uv_call(0, (u64)&uvcb);
uv_ioctl->uv_rc = uvcb.header.rc;
uv_ioctl->uv_rrc = uvcb.header.rrc;
@@ -457,7 +457,7 @@ static int uvio_retr_secret(struct uvio_ioctl_cb *uv_ioctl)
uvcb.buf_addr = (u64)buf;
uvcb.buf_size = buf_len;
- uv_call_sched(0, (u64)&uvcb);
+ uv_call(0, (u64)&uvcb);
if (copy_to_user((__user void *)uv_ioctl->argument_addr, buf, buf_len))
goto err;
--
2.53.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v3 3/4] s390: Remove cond_resched() calls
2026-07-30 5:29 [PATCH v3 0/4] s390: Remove or replace cond_resched() calls Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1) Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 2/4] KVM: s390: Remove cond_resched() calls Heiko Carstens
@ 2026-07-30 5:29 ` Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 4/4] s390/cio: " Heiko Carstens
3 siblings, 0 replies; 8+ messages in thread
From: Heiko Carstens @ 2026-07-30 5:29 UTC (permalink / raw)
To: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
Claudio Imbrenda, David Hildenbrand, Peter Zijlstra, Herbert Xu
Cc: linux-s390, linux-kernel, linux-crypto
Since [1] cond_resched() is a no-op on s390. Remove all calls.
[1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
arch/s390/kernel/perf_cpum_cf.c | 1 -
arch/s390/mm/cmm.c | 2 --
arch/s390/mm/pageattr.c | 5 -----
arch/s390/mm/pgalloc.c | 1 -
arch/s390/pci/pci.c | 4 +---
5 files changed, 1 insertion(+), 12 deletions(-)
diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c
index 2076ac22e2c4..5f2596be6c1e 100644
--- a/arch/s390/kernel/perf_cpum_cf.c
+++ b/arch/s390/kernel/perf_cpum_cf.c
@@ -1496,7 +1496,6 @@ static int cfset_all_copy(unsigned long arg, cpumask_t *mask)
goto out;
}
uptr += sizeof(struct s390_ctrset_cpudata) + cpuhw->used;
- cond_resched();
}
cpus = cpumask_weight(mask);
if (put_user(cpus, &ctrset_read->no_cpus))
diff --git a/arch/s390/mm/cmm.c b/arch/s390/mm/cmm.c
index eb7ef63fab1e..d342b68ee9be 100644
--- a/arch/s390/mm/cmm.c
+++ b/arch/s390/mm/cmm.c
@@ -95,7 +95,6 @@ static long cmm_alloc_pages(long nr, long *counter,
(*counter)++;
spin_unlock(&cmm_lock);
nr--;
- cond_resched();
}
return nr;
}
@@ -134,7 +133,6 @@ static long cmm_free_pages(long nr, long *counter, struct cmm_page_array **list)
inc = __cmm_free_pages(inc, counter, list);
if (inc)
break;
- cond_resched();
}
return nr + inc;
}
diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c
index e6f788696dd1..1e202e3d08e7 100644
--- a/arch/s390/mm/pageattr.c
+++ b/arch/s390/mm/pageattr.c
@@ -105,7 +105,6 @@ static int walk_pte_level(pmd_t *pmdp, unsigned long addr, unsigned long end,
pgt_set((unsigned long *)ptep, pte_val(new), addr, CRDTE_DTT_PAGE);
ptep++;
addr += PAGE_SIZE;
- cond_resched();
} while (addr < end);
return 0;
}
@@ -194,7 +193,6 @@ static int walk_pmd_level(pud_t *pudp, unsigned long addr, unsigned long end,
}
pmdp++;
addr = next;
- cond_resched();
} while (addr < end);
return rc;
}
@@ -281,7 +279,6 @@ static int walk_pud_level(p4d_t *p4d, unsigned long addr, unsigned long end,
}
pudp++;
addr = next;
- cond_resched();
} while (addr < end && !rc);
return rc;
}
@@ -301,7 +298,6 @@ static int walk_p4d_level(pgd_t *pgd, unsigned long addr, unsigned long end,
rc = walk_pud_level(p4dp, addr, next, flags);
p4dp++;
addr = next;
- cond_resched();
} while (addr < end && !rc);
return rc;
}
@@ -323,7 +319,6 @@ static int change_page_attr(unsigned long addr, unsigned long end,
rc = walk_p4d_level(pgdp, addr, next, flags);
if (rc)
break;
- cond_resched();
} while (pgdp++, addr = next, addr < end && !rc);
return rc;
}
diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c
index 7ac44543e051..9610770fcf6d 100644
--- a/arch/s390/mm/pgalloc.c
+++ b/arch/s390/mm/pgalloc.c
@@ -268,7 +268,6 @@ static int base_segment_walk(unsigned long *origin, unsigned long addr,
return rc;
if (!alloc)
base_pgt_free(table);
- cond_resched();
} while (ste++, addr = next, addr < end);
return 0;
}
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 39bd2adfc240..2dec238f3f12 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -1173,10 +1173,8 @@ int zpci_scan_devices(void)
return rc;
zpci_add_devices(&scan_list);
- zpci_bus_for_each(zbus) {
+ zpci_bus_for_each(zbus)
zpci_bus_scan_bus(zbus);
- cond_resched();
- }
return 0;
}
--
2.53.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v3 4/4] s390/cio: Remove cond_resched() calls
2026-07-30 5:29 [PATCH v3 0/4] s390: Remove or replace cond_resched() calls Heiko Carstens
` (2 preceding siblings ...)
2026-07-30 5:29 ` [PATCH v3 3/4] " Heiko Carstens
@ 2026-07-30 5:29 ` Heiko Carstens
3 siblings, 0 replies; 8+ messages in thread
From: Heiko Carstens @ 2026-07-30 5:29 UTC (permalink / raw)
To: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
Claudio Imbrenda, David Hildenbrand, Peter Zijlstra, Herbert Xu
Cc: linux-s390, linux-kernel, linux-crypto
Since [1] cond_resched() is a no-op on s390. Remove all calls.
[1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
drivers/s390/cio/css.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c
index e5a0ec6b4e3e..54b8b8639694 100644
--- a/drivers/s390/cio/css.c
+++ b/drivers/s390/cio/css.c
@@ -618,11 +618,6 @@ static int slow_eval_known_fn(struct subchannel *sch, void *data)
rc = css_evaluate_known_subchannel(sch, 1);
if (rc == -EAGAIN)
css_schedule_eval(sch->schid);
- /*
- * The loop might take long time for platforms with lots of
- * known devices. Allow scheduling here.
- */
- cond_resched();
}
return 0;
}
@@ -654,9 +649,6 @@ static int slow_eval_unknown_fn(struct subchannel_id schid, void *data)
default:
rc = 0;
}
- /* Allow scheduling here since the containing loop might
- * take a while. */
- cond_resched();
}
return rc;
}
--
2.53.0
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1)
2026-07-30 5:29 ` [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1) Heiko Carstens
@ 2026-07-30 7:47 ` Holger Dengler
2026-07-30 10:11 ` Peter Zijlstra
1 sibling, 0 replies; 8+ messages in thread
From: Holger Dengler @ 2026-07-30 7:47 UTC (permalink / raw)
To: Heiko Carstens
Cc: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Vineeth Vijayan,
Peter Oberparleiter, Janosch Frank, Claudio Imbrenda,
David Hildenbrand, Peter Zijlstra, Herbert Xu, linux-s390,
linux-kernel, linux-crypto
On 7/30/26 07:29, Heiko Carstens wrote:
> With [1] cond_resched() is always compiled away and becomes a no-op.
>
> The comments for all cond_resched() calls in crypto code however indicate
> that the current process should be scheduled away to avoid instant
> re-invocation of a callback. This is not what cond_resched() would do or
> did.
>
> Instead of just removing the cond_resched() calls, replace them with
> msleep() calls, as suggested by Holger Dengler. This forces the current
> task to be scheduled away (sleeps) like originally intended.
>
> [1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
>
> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
As in v2
Reviewed-by: Holger Dengler <dengler@linux.ibm.com>
--
Mit freundlichen Grüßen / Kind regards
Holger Dengler
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 2/4] KVM: s390: Remove cond_resched() calls
2026-07-30 5:29 ` [PATCH v3 2/4] KVM: s390: Remove cond_resched() calls Heiko Carstens
@ 2026-07-30 8:51 ` Claudio Imbrenda
0 siblings, 0 replies; 8+ messages in thread
From: Claudio Imbrenda @ 2026-07-30 8:51 UTC (permalink / raw)
To: Heiko Carstens
Cc: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
David Hildenbrand, Peter Zijlstra, Herbert Xu, linux-s390,
linux-kernel, linux-crypto
On Thu, 30 Jul 2026 07:29:05 +0200
Heiko Carstens <hca@linux.ibm.com> wrote:
> Since [1] cond_resched() is a no-op on s390. Remove all calls.
>
> This also entirely removes uv_call_sched() and replaces all call sites
> with uv_call(), since both functions are identical after the removal
> of cond_resched().
>
> [1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
>
> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
> ---
> arch/s390/include/asm/uv.h | 16 ++--------------
> arch/s390/kernel/uv.c | 2 +-
> arch/s390/kvm/gaccess.c | 8 ++------
> arch/s390/kvm/gmap.c | 4 ----
> arch/s390/kvm/kvm-s390.c | 1 -
> arch/s390/kvm/pv.c | 11 +++++------
> arch/s390/kvm/vsie.c | 1 -
> arch/s390/mm/gmap_helpers.c | 1 -
> drivers/s390/char/uvdevice.c | 6 +++---
> 9 files changed, 13 insertions(+), 37 deletions(-)
>
> diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
> index d919e69662f5..89c9bb56c7e6 100644
> --- a/arch/s390/include/asm/uv.h
> +++ b/arch/s390/include/asm/uv.h
> @@ -454,18 +454,6 @@ static inline int uv_call(unsigned long r1, unsigned long r2)
> return cc;
> }
>
> -/* Low level uv_call that avoids stalls for long running busy conditions */
> -static inline int uv_call_sched(unsigned long r1, unsigned long r2)
> -{
> - int cc;
> -
> - do {
> - cc = __uv_call(r1, r2);
> - cond_resched();
> - } while (cc > 1);
> - return cc;
> -}
> -
> /*
> * special variant of uv_call that only transports the cpu or guest
> * handle and the command, like destroy or verify.
> @@ -480,7 +468,7 @@ static inline int uv_cmd_nodata(u64 handle, u16 cmd, u16 *rc, u16 *rrc)
> int cc;
>
> WARN(!handle, "No handle provided to Ultravisor call cmd %x\n", cmd);
> - cc = uv_call_sched(0, (u64)&uvcb);
> + cc = uv_call(0, (u64)&uvcb);
> *rc = uvcb.header.rc;
> *rrc = uvcb.header.rrc;
> return cc ? -EINVAL : 0;
> @@ -518,7 +506,7 @@ static inline int uv_list_secrets(struct uv_secret_list *buf, u16 start_idx,
> .start_idx = start_idx,
> .list_addr = (u64)buf,
> };
> - int cc = uv_call_sched(0, (u64)&uvcb);
> + int cc = uv_call(0, (u64)&uvcb);
>
> if (rc)
> *rc = uvcb.header.rc;
> diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
> index a284f98d9716..62841bb00a26 100644
> --- a/arch/s390/kernel/uv.c
> +++ b/arch/s390/kernel/uv.c
> @@ -831,7 +831,7 @@ int uv_retrieve_secret(u16 secret_idx, u8 *buf, size_t buf_size)
> .buf_size = buf_size,
> };
>
> - uv_call_sched(0, (u64)&uvcb);
> + uv_call(0, (u64)&uvcb);
>
> switch (uvcb.header.rc) {
> case UVC_RC_EXECUTED:
> diff --git a/arch/s390/kvm/gaccess.c b/arch/s390/kvm/gaccess.c
> index 36102b2727fb..0d389a302a70 100644
> --- a/arch/s390/kvm/gaccess.c
> +++ b/arch/s390/kvm/gaccess.c
> @@ -151,10 +151,8 @@ static void ipte_lock_simple(struct kvm *kvm)
> ic = &kvm->arch.sca->ipte_control;
> old = READ_ONCE(*ic);
> do {
> - if (old.k) {
> - cond_resched();
> + if (old.k)
> goto retry;
> - }
> new = old;
> new.k = 1;
> } while (!try_cmpxchg(&ic->val, &old.val, new.val));
> @@ -189,10 +187,8 @@ static void ipte_lock_siif(struct kvm *kvm)
> ic = &kvm->arch.sca->ipte_control;
> old = READ_ONCE(*ic);
> do {
> - if (old.kg) {
> - cond_resched();
> + if (old.kg)
> goto retry;
> - }
> new = old;
> new.k = 1;
> new.kh++;
> diff --git a/arch/s390/kvm/gmap.c b/arch/s390/kvm/gmap.c
> index 8abb4f55b306..3758e4009709 100644
> --- a/arch/s390/kvm/gmap.c
> +++ b/arch/s390/kvm/gmap.c
> @@ -941,7 +941,6 @@ void gmap_split_huge_pages(struct gmap *gmap)
> scoped_guard(read_lock, &gmap->kvm->mmu_lock)
> start = _dat_walk_gfn_range(start, asce_end(gmap->asce), gmap->asce,
> &ops, DAT_WALK_IGN_HOLES, gmap);
> - cond_resched();
> } while (start);
> }
>
> @@ -963,7 +962,6 @@ static int _gmap_enable_skeys(struct gmap *gmap)
> do {
> scoped_guard(write_lock, &gmap->kvm->mmu_lock)
> start = dat_reset_skeys(gmap->asce, start);
> - cond_resched();
> } while (start);
> return 0;
> }
> @@ -1019,7 +1017,6 @@ int gmap_pv_destroy_range(struct gmap *gmap, gfn_t start, gfn_t end, bool interr
> DAT_WALK_IGN_HOLES, NULL);
> if (interruptible && fatal_signal_pending(current))
> return -EINTR;
> - cond_resched();
> } while (start && start < end);
> return 0;
> }
> @@ -1138,7 +1135,6 @@ void _gmap_set_cmma_all(struct gmap *gmap, bool dirty)
> gfn = _dat_walk_gfn_range(gfn, asce_end(gmap->asce), gmap->asce, &ops,
> DAT_WALK_IGN_HOLES,
> &gmap->kvm->arch.cmma_dirty_pages);
> - cond_resched();
> } while (gfn);
> }
>
> diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
> index 150b5dd2170e..2ede8f035a38 100644
> --- a/arch/s390/kvm/kvm-s390.c
> +++ b/arch/s390/kvm/kvm-s390.c
> @@ -1027,7 +1027,6 @@ static int kvm_s390_set_mem_control(struct kvm *kvm, struct kvm_device_attr *att
> do {
> scoped_guard(read_lock, &kvm->mmu_lock)
> start_gfn = dat_reset_cmma(kvm->arch.gmap->asce, start_gfn);
> - cond_resched();
> } while (start_gfn);
> ret = 0;
> break;
> diff --git a/arch/s390/kvm/pv.c b/arch/s390/kvm/pv.c
> index 1beacc841ca8..54c17ddb6b11 100644
> --- a/arch/s390/kvm/pv.c
> +++ b/arch/s390/kvm/pv.c
> @@ -429,7 +429,7 @@ static int kvm_s390_pv_deinit_vm_fast(struct kvm *kvm, u16 *rc, u16 *rrc)
> };
> int cc;
>
> - cc = uv_call_sched(0, (u64)&uvcb);
> + cc = uv_call(0, (u64)&uvcb);
> if (rc)
> *rc = uvcb.header.rc;
> if (rrc)
> @@ -746,7 +746,7 @@ int kvm_s390_pv_init_vm(struct kvm *kvm, u16 *rc, u16 *rrc)
> }
> gmap_split_huge_pages(kvm->arch.gmap);
>
> - cc = uv_call_sched(0, (u64)&uvcb);
> + cc = uv_call(0, (u64)&uvcb);
> *rc = uvcb.header.rc;
> *rrc = uvcb.header.rrc;
> KVM_UV_EVENT(kvm, 3, "PROTVIRT CREATE VM: handle %llx len %llx rc %x rrc %x flags %04x",
> @@ -832,7 +832,6 @@ int kvm_s390_pv_unpack(struct kvm *kvm, unsigned long addr, unsigned long size,
> while (offset < size) {
> ret = unpack_one(kvm, addr, tweak, offset, rc, rrc);
> if (ret == -EAGAIN) {
> - cond_resched();
> if (fatal_signal_pending(current))
> break;
> continue;
> @@ -875,7 +874,7 @@ int kvm_s390_pv_dump_cpu(struct kvm_vcpu *vcpu, void *buff, u16 *rc, u16 *rrc)
> };
> int cc;
>
> - cc = uv_call_sched(0, (u64)&uvcb);
> + cc = uv_call(0, (u64)&uvcb);
> *rc = uvcb.header.rc;
> *rrc = uvcb.header.rrc;
> return cc;
> @@ -959,7 +958,7 @@ int kvm_s390_pv_dump_stor_state(struct kvm *kvm, void __user *buff_user,
> /* We will loop until the user buffer is filled or an error occurs */
> do {
> /* Get 1MB worth of guest storage state data */
> - cc = uv_call_sched(0, (u64)&uvcb);
> + cc = uv_call(0, (u64)&uvcb);
>
> /* All or nothing */
> if (cc) {
> @@ -1037,7 +1036,7 @@ int kvm_s390_pv_dump_complete(struct kvm *kvm, void __user *buff_user,
> return -ENOMEM;
> complete.dump_area_origin = (u64)compl_data;
>
> - ret = uv_call_sched(0, (u64)&complete);
> + ret = uv_call(0, (u64)&complete);
> *rc = complete.header.rc;
> *rrc = complete.header.rrc;
> KVM_UV_EVENT(kvm, 3, "PROTVIRT DUMP COMPLETE: rc %x rrc %x",
> diff --git a/arch/s390/kvm/vsie.c b/arch/s390/kvm/vsie.c
> index eea24562e7db..6dcd3b110c17 100644
> --- a/arch/s390/kvm/vsie.c
> +++ b/arch/s390/kvm/vsie.c
> @@ -1434,7 +1434,6 @@ static int vsie_run(struct kvm_vcpu *vcpu, struct vsie_page *vsie_page)
> }
> if (sg)
> sg = gmap_put(sg);
> - cond_resched();
> }
> if (sg)
> sg = gmap_put(sg);
> diff --git a/arch/s390/mm/gmap_helpers.c b/arch/s390/mm/gmap_helpers.c
> index 4bf7c9012feb..d564cdefb90f 100644
> --- a/arch/s390/mm/gmap_helpers.c
> +++ b/arch/s390/mm/gmap_helpers.c
> @@ -272,7 +272,6 @@ static int __gmap_helper_unshare_zeropages(struct mm_struct *mm)
> * truncation. In that case, the shared zeropage would be gone
> * and we can simply retry and make progress.
> */
> - cond_resched();
> goto retry;
> }
>
> diff --git a/drivers/s390/char/uvdevice.c b/drivers/s390/char/uvdevice.c
> index e6a264c996ce..4d274a2ee84d 100644
> --- a/drivers/s390/char/uvdevice.c
> +++ b/drivers/s390/char/uvdevice.c
> @@ -224,7 +224,7 @@ static int uvio_attestation(struct uvio_ioctl_cb *uv_ioctl)
> if (ret)
> goto out;
>
> - uv_call_sched(0, (u64)uvcb_attest);
> + uv_call(0, (u64)uvcb_attest);
>
> uv_ioctl->uv_rc = uvcb_attest->header.rc;
> uv_ioctl->uv_rrc = uvcb_attest->header.rrc;
> @@ -291,7 +291,7 @@ static int uvio_add_secret(struct uvio_ioctl_cb *uv_ioctl)
>
> ret = 0;
> uvcb.addr = (u64)asrcb;
> - uv_call_sched(0, (u64)&uvcb);
> + uv_call(0, (u64)&uvcb);
> uv_ioctl->uv_rc = uvcb.header.rc;
> uv_ioctl->uv_rrc = uvcb.header.rrc;
>
> @@ -457,7 +457,7 @@ static int uvio_retr_secret(struct uvio_ioctl_cb *uv_ioctl)
>
> uvcb.buf_addr = (u64)buf;
> uvcb.buf_size = buf_len;
> - uv_call_sched(0, (u64)&uvcb);
> + uv_call(0, (u64)&uvcb);
>
> if (copy_to_user((__user void *)uv_ioctl->argument_addr, buf, buf_len))
> goto err;
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1)
2026-07-30 5:29 ` [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1) Heiko Carstens
2026-07-30 7:47 ` Holger Dengler
@ 2026-07-30 10:11 ` Peter Zijlstra
1 sibling, 0 replies; 8+ messages in thread
From: Peter Zijlstra @ 2026-07-30 10:11 UTC (permalink / raw)
To: Heiko Carstens
Cc: Alexander Gordeev, Sven Schnelle, Vasily Gorbik,
Christian Borntraeger, Harald Freudenberger, Holger Dengler,
Vineeth Vijayan, Peter Oberparleiter, Janosch Frank,
Claudio Imbrenda, David Hildenbrand, Herbert Xu, linux-s390,
linux-kernel, linux-crypto
On Thu, Jul 30, 2026 at 07:29:04AM +0200, Heiko Carstens wrote:
> With [1] cond_resched() is always compiled away and becomes a no-op.
>
> The comments for all cond_resched() calls in crypto code however indicate
> that the current process should be scheduled away to avoid instant
> re-invocation of a callback. This is not what cond_resched() would do or
> did.
>
> Instead of just removing the cond_resched() calls, replace them with
> msleep() calls, as suggested by Holger Dengler. This forces the current
> task to be scheduled away (sleeps) like originally intended.
>
> [1] commit 7dadeaa6e851 ("sched: Further restrict the preemption modes")
>
> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
> ---
> arch/s390/crypto/paes_s390.c | 8 ++++----
> arch/s390/crypto/phmac_s390.c | 4 ++--
> 2 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/arch/s390/crypto/paes_s390.c b/arch/s390/crypto/paes_s390.c
> index 8cfe6166c193..511cb6105436 100644
> --- a/arch/s390/crypto/paes_s390.c
> +++ b/arch/s390/crypto/paes_s390.c
> @@ -555,7 +555,7 @@ static int ecb_paes_do_one_request(struct crypto_engine *engine, void *areq)
> * To avoid immediately re-invocation of this callback,
> * tell the scheduler to voluntarily give up the CPU here.
> */
> - cond_resched();
> + msleep(1);
> pr_debug("rescheduling request\n");
> return -ENOSPC;
> } else if (rc) {
I am somewhat conflicted on this. It will add a 'random' delay to this
crypto user (which might be real-time task) that is not related to the
actual event this is waiting for.
That is, it could be that this key expiration thing is sorted way faster
than this one milisecond.
Is there nothing the crypto layer can do that is more clever; like a
condition variable on the key update when -ENOSPC is returned or
something.
This all sounds like a horrible hack one way or the other.
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-07-30 10:12 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-30 5:29 [PATCH v3 0/4] s390: Remove or replace cond_resched() calls Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 1/4] s390/crypto: Replace cond_resched() with msleep(1) Heiko Carstens
2026-07-30 7:47 ` Holger Dengler
2026-07-30 10:11 ` Peter Zijlstra
2026-07-30 5:29 ` [PATCH v3 2/4] KVM: s390: Remove cond_resched() calls Heiko Carstens
2026-07-30 8:51 ` Claudio Imbrenda
2026-07-30 5:29 ` [PATCH v3 3/4] " Heiko Carstens
2026-07-30 5:29 ` [PATCH v3 4/4] s390/cio: " Heiko Carstens
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox