Message ID | 20220303210425.1693486-2-farman@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | s390x: SIGP fixes | expand |
On Thu, 2022-03-03 at 22:04 +0100, Eric Farman wrote: > The routine smp_cpu_stopped() issues a SIGP SENSE, and returns true > if it received a CC1 (STATUS STORED) with the STOPPED or CHECK STOP > bits enabled. Otherwise, it returns false. > > This is misleading, because a CC2 (BUSY) merely indicates that the > order code could not be processed, not that the CPU is operating. > It could be operating but in the process of being stopped. > > Convert the invocation of the SIGP SENSE to retry when a CC2 is > received, so we get a more definitive answer. > > Signed-off-by: Eric Farman <farman@linux.ibm.com> Reviewed-by: Nico Boehr <nrb@linux.ibm.com>
On Thu, 3 Mar 2022 22:04:20 +0100 Eric Farman <farman@linux.ibm.com> wrote: > The routine smp_cpu_stopped() issues a SIGP SENSE, and returns true > if it received a CC1 (STATUS STORED) with the STOPPED or CHECK STOP > bits enabled. Otherwise, it returns false. > > This is misleading, because a CC2 (BUSY) merely indicates that the > order code could not be processed, not that the CPU is operating. > It could be operating but in the process of being stopped. > > Convert the invocation of the SIGP SENSE to retry when a CC2 is > received, so we get a more definitive answer. > > Signed-off-by: Eric Farman <farman@linux.ibm.com> > Reviewed-by: Janosch Frank <frankja@linux.ibm.com> Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com> > --- > lib/s390x/smp.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c > index 46e1b022..368d6add 100644 > --- a/lib/s390x/smp.c > +++ b/lib/s390x/smp.c > @@ -78,7 +78,7 @@ bool smp_cpu_stopped(uint16_t idx) > { > uint32_t status; > > - if (smp_sigp(idx, SIGP_SENSE, 0, &status) != > SIGP_CC_STATUS_STORED) > + if (smp_sigp_retry(idx, SIGP_SENSE, 0, &status) != > SIGP_CC_STATUS_STORED) return false; > return !!(status & > (SIGP_STATUS_CHECK_STOP|SIGP_STATUS_STOPPED)); }
diff --git a/lib/s390x/smp.c b/lib/s390x/smp.c index 46e1b022..368d6add 100644 --- a/lib/s390x/smp.c +++ b/lib/s390x/smp.c @@ -78,7 +78,7 @@ bool smp_cpu_stopped(uint16_t idx) { uint32_t status; - if (smp_sigp(idx, SIGP_SENSE, 0, &status) != SIGP_CC_STATUS_STORED) + if (smp_sigp_retry(idx, SIGP_SENSE, 0, &status) != SIGP_CC_STATUS_STORED) return false; return !!(status & (SIGP_STATUS_CHECK_STOP|SIGP_STATUS_STOPPED)); }