On 14.12.18 11:06, David Hildenbrand wrote: > Looking at what the kernel does, looks like we should > - Check for more errors > - Try to execute !FORCED read if the FORCED one is unknown > - Set the function code to a normal write > - Set control_mask[2] to 0x80 (no idea what that means) It's great that they set that and never actually check for its effects... It's (drum roll): SCLP_VARIABLE_LENGTH_RESPONSE > > The kernel seems to set the function code to 0x80. Looking at where that > comes from, turns out this is a "dump indicator" to produce more > meaningful dumps. Looking for other function codes used in the kernel, I > discovered 0x40, which is used for "single increment assign" to speed up > memory hotplug. I was not able to find out what "control_mask[2] = 0x80" > means. > > I guess we can just set the funcion code to 0 ("normal write). Let's > document the other bits in case anybody ever wonders what they mean. > Also, let's just set the other bits in the mask to 0, not sure if they > will actually be used, but this is definetly not wrong. > > Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> > --- I rebased my series on top of this patch and it works under LPAR: Tested-by: Janosch Frank <frankja@xxxxxxxxxxxxx> Please update the description, but apart from that: Reviewed-by: Janosch Frank <frankja@xxxxxxxxxxxxx> [...] > +static void sclp_read_scp_info(ReadInfo *ri, int length) > +{ > + unsigned int commands[] = { SCLP_CMDW_READ_SCP_INFO_FORCED, > + SCLP_CMDW_READ_SCP_INFO }; > + int i; > + > + for (i = 0; i < ARRAY_SIZE(commands); i++) { > + ri->h.length = length; > + ri->h.function_code = SCLP_FC_NORMAL_WRITE; > + ri->h.control_mask[0] = 0; > + ri->h.control_mask[1] = 0; > + ri->h.control_mask[2] = 0x80; We could test for the SCLP_RC_INSUFFICIENT_SCCB_LENGTH and redrive with a longer response space because we set SCLP_VARIABLE_LENGTH_RESPONSE but 4k should be enough for tests. I do not expect this to be executed with a few hundred VCPUs anyway. > + > + if (sclp_service_call(commands[i], ri)) > + break; > + if (ri->h.response_code == SCLP_RC_NORMAL_READ_COMPLETION) > + return; > + if (ri->h.response_code != SCLP_RC_INVALID_SCLP_COMMAND) > + break; [...] > diff --git a/lib/s390x/sclp.h b/lib/s390x/sclp.h > index 21d482b..131813e 100644 > --- a/lib/s390x/sclp.h > +++ b/lib/s390x/sclp.h > @@ -76,6 +76,8 @@ > #define SCLP_EVENT_BUFFER_ACCEPTED 0x80 > > #define SCLP_FC_NORMAL_WRITE 0 > +#define SCLP_FC_SINGLE_INCREMENT_ASSIGN 0x40 > +#define SCLP_FC_DUMP_INDICATOR 0x80 If you want I could take that into my cleanups. > > typedef struct SCCBHeader { > uint16_t length; >
Attachment:
signature.asc
Description: OpenPGP digital signature