Message ID | 20170727015418.85407-3-bjsdjshi@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 27 Jul 2017 03:54:17 +0200 Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> wrote: > A successful completion of rchp should signal a solicited channel path > initialized CRW (channel report word), while the current implementation > always generates an un-solicited one. Let's fix this. Sounds legit. > > Reported-by: Halil Pasic <pasic@linux.vnet.ibm.com> > Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> > --- > hw/s390x/css.c | 15 +++++++++------ > include/hw/s390x/css.h | 2 +- > 2 files changed, 10 insertions(+), 7 deletions(-) > > diff --git a/hw/s390x/css.c b/hw/s390x/css.c > index 5321ca016b..60e1592d5c 100644 > --- a/hw/s390x/css.c > +++ b/hw/s390x/css.c > @@ -1745,10 +1745,10 @@ int css_do_rchp(uint8_t cssid, uint8_t chpid) > } > > /* We don't really use a channel path, so we're done here. */ > - css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, > + css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, > channel_subsys.max_cssid > 0 ? 1 : 0, chpid); > if (channel_subsys.max_cssid > 0) { > - css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 0, real_cssid << 8); > + css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, 0, real_cssid << 8); > } > return 0; > } > @@ -2028,7 +2028,7 @@ void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid, > } > } > > -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) > +void css_queue_crw(uint8_t rsc, uint8_t erc, int s, int chain, uint16_t rsid) 's' is not a very speaking name... > { > CrwContainer *crw_cont; > > @@ -2040,6 +2040,9 @@ void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) > return; > } > crw_cont->crw.flags = (rsc << 8) | erc; > + if (s) { > + crw_cont->crw.flags |= CRW_FLAGS_MASK_S; ...as it obviously causes the S flag to be set ;) Let's call it 'solicited'? > + } > if (chain) { > crw_cont->crw.flags |= CRW_FLAGS_MASK_C; > } > @@ -2086,9 +2089,9 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, > } > chain_crw = (channel_subsys.max_ssid > 0) || > (channel_subsys.max_cssid > 0); > - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, chain_crw ? 1 : 0, schid); > + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, chain_crw ? 1 : 0, schid); > if (chain_crw) { > - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, > + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, 0, > (guest_cssid << 8) | (ssid << 4)); > } > /* RW_ERC_IPI --> clear pending interrupts */ > @@ -2103,7 +2106,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid) > void css_generate_css_crws(uint8_t cssid) > { > if (!channel_subsys.sei_pending) { > - css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid); > + css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, 0, cssid); Should we want to support OS-triggered channel path vary (via SCLP or otherwise) in the future, we'll probably need a version that generates a solicited crw. > } > channel_subsys.sei_pending = true; > } > diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h > index 5c5fe6b202..d03b4ffeac 100644 > --- a/include/hw/s390x/css.h > +++ b/include/hw/s390x/css.h > @@ -150,7 +150,7 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src); > void css_inject_io_interrupt(SubchDev *sch); > void css_reset(void); > void css_reset_sch(SubchDev *sch); > -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid); > +void css_queue_crw(uint8_t rsc, uint8_t erc, int s, int chain, uint16_t rsid); > void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, > int hotplugged, int add); > void css_generate_chp_crws(uint8_t cssid, uint8_t chpid); Otherwise, patch looks good.
* Cornelia Huck <cohuck@redhat.com> [2017-07-27 13:22:59 +0200]: [...] > > diff --git a/hw/s390x/css.c b/hw/s390x/css.c [...] > > @@ -2028,7 +2028,7 @@ void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid, > > } > > } > > > > -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) > > +void css_queue_crw(uint8_t rsc, uint8_t erc, int s, int chain, uint16_t rsid) > > 's' is not a very speaking name... > > > { > > CrwContainer *crw_cont; > > > > @@ -2040,6 +2040,9 @@ void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) > > return; > > } > > crw_cont->crw.flags = (rsc << 8) | erc; > > + if (s) { > > + crw_cont->crw.flags |= CRW_FLAGS_MASK_S; > > ...as it obviously causes the S flag to be set ;) Let's call it 'solicited'? Sure. Will adopt. > > > + } > > if (chain) { > > crw_cont->crw.flags |= CRW_FLAGS_MASK_C; > > } > > @@ -2086,9 +2089,9 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, > > } > > chain_crw = (channel_subsys.max_ssid > 0) || > > (channel_subsys.max_cssid > 0); > > - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, chain_crw ? 1 : 0, schid); > > + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, chain_crw ? 1 : 0, schid); > > if (chain_crw) { > > - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, > > + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, 0, > > (guest_cssid << 8) | (ssid << 4)); > > } > > /* RW_ERC_IPI --> clear pending interrupts */ > > @@ -2103,7 +2106,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid) > > void css_generate_css_crws(uint8_t cssid) > > { > > if (!channel_subsys.sei_pending) { > > - css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid); > > + css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, 0, cssid); > > Should we want to support OS-triggered channel path vary (via SCLP or > otherwise) in the future, Yes! I had a prototype of series to handle the OS-triggered chp vary, and that needs... > we'll probably need a version that generates a solicited crw. ...the new interface with the solicited bit param, which is provided by patch #3: void css_generate_chp_crws(uint8_t cssid, uint8_t chpid, int hotplugged, int add, int s); BTW, I need to renew the legal clearance before sending them out... > > > } > > channel_subsys.sei_pending = true; > > } > > diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h > > index 5c5fe6b202..d03b4ffeac 100644 > > --- a/include/hw/s390x/css.h > > +++ b/include/hw/s390x/css.h > > @@ -150,7 +150,7 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src); > > void css_inject_io_interrupt(SubchDev *sch); > > void css_reset(void); > > void css_reset_sch(SubchDev *sch); > > -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid); > > +void css_queue_crw(uint8_t rsc, uint8_t erc, int s, int chain, uint16_t rsid); > > void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, > > int hotplugged, int add); > > void css_generate_chp_crws(uint8_t cssid, uint8_t chpid); > > Otherwise, patch looks good. Thanks. So, I only need to s/s/solicited for the new version of this one? >
On Fri, 28 Jul 2017 15:25:26 +0800
Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> wrote:
> So, I only need to s/s/solicited for the new version of this one?
Yes, that would be fine.
diff --git a/hw/s390x/css.c b/hw/s390x/css.c index 5321ca016b..60e1592d5c 100644 --- a/hw/s390x/css.c +++ b/hw/s390x/css.c @@ -1745,10 +1745,10 @@ int css_do_rchp(uint8_t cssid, uint8_t chpid) } /* We don't really use a channel path, so we're done here. */ - css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, + css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, channel_subsys.max_cssid > 0 ? 1 : 0, chpid); if (channel_subsys.max_cssid > 0) { - css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 0, real_cssid << 8); + css_queue_crw(CRW_RSC_CHP, CRW_ERC_INIT, 1, 0, real_cssid << 8); } return 0; } @@ -2028,7 +2028,7 @@ void css_subch_assign(uint8_t cssid, uint8_t ssid, uint16_t schid, } } -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) +void css_queue_crw(uint8_t rsc, uint8_t erc, int s, int chain, uint16_t rsid) { CrwContainer *crw_cont; @@ -2040,6 +2040,9 @@ void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid) return; } crw_cont->crw.flags = (rsc << 8) | erc; + if (s) { + crw_cont->crw.flags |= CRW_FLAGS_MASK_S; + } if (chain) { crw_cont->crw.flags |= CRW_FLAGS_MASK_C; } @@ -2086,9 +2089,9 @@ void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, } chain_crw = (channel_subsys.max_ssid > 0) || (channel_subsys.max_cssid > 0); - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, chain_crw ? 1 : 0, schid); + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, chain_crw ? 1 : 0, schid); if (chain_crw) { - css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, + css_queue_crw(CRW_RSC_SUBCH, CRW_ERC_IPI, 0, 0, (guest_cssid << 8) | (ssid << 4)); } /* RW_ERC_IPI --> clear pending interrupts */ @@ -2103,7 +2106,7 @@ void css_generate_chp_crws(uint8_t cssid, uint8_t chpid) void css_generate_css_crws(uint8_t cssid) { if (!channel_subsys.sei_pending) { - css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, cssid); + css_queue_crw(CRW_RSC_CSS, CRW_ERC_EVENT, 0, 0, cssid); } channel_subsys.sei_pending = true; } diff --git a/include/hw/s390x/css.h b/include/hw/s390x/css.h index 5c5fe6b202..d03b4ffeac 100644 --- a/include/hw/s390x/css.h +++ b/include/hw/s390x/css.h @@ -150,7 +150,7 @@ void copy_scsw_to_guest(SCSW *dest, const SCSW *src); void css_inject_io_interrupt(SubchDev *sch); void css_reset(void); void css_reset_sch(SubchDev *sch); -void css_queue_crw(uint8_t rsc, uint8_t erc, int chain, uint16_t rsid); +void css_queue_crw(uint8_t rsc, uint8_t erc, int s, int chain, uint16_t rsid); void css_generate_sch_crws(uint8_t cssid, uint8_t ssid, uint16_t schid, int hotplugged, int add); void css_generate_chp_crws(uint8_t cssid, uint8_t chpid);
A successful completion of rchp should signal a solicited channel path initialized CRW (channel report word), while the current implementation always generates an un-solicited one. Let's fix this. Reported-by: Halil Pasic <pasic@linux.vnet.ibm.com> Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com> --- hw/s390x/css.c | 15 +++++++++------ include/hw/s390x/css.h | 2 +- 2 files changed, 10 insertions(+), 7 deletions(-)