[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/3] s390x/css: Don't save orb in subchannel.
From: |
Christian Borntraeger |
Subject: |
Re: [Qemu-devel] [PATCH 3/3] s390x/css: Don't save orb in subchannel. |
Date: |
Mon, 05 May 2014 20:52:10 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20100101 Thunderbird/24.5.0 |
On 05/05/14 17:10, Cornelia Huck wrote:
> Current css code saves the operation request block (orb) in the
> subchannel structure for later consumption by the start function
> handler. This might make sense for asynchronous execution of the
> start function (which qemu doesn't support), but not in our case;
> it would even be wrong since orb contains a reference to a local
> variable in the base ssch handler.
>
> Let's just pass the orb through the start function call chain for
> ssch; for rsch, we can pass NULL as the backend function does not
> use any information passed via the orb there.
>
> Signed-off-by: Cornelia Huck <address@hidden>
Good, this makes the whole thing simpler. Furthermore, this also avoids the
need to take care of the orb in the vmstate for migration since it is no longer
a state.
Acked-by: Christian Borntraeger <address@hidden>
> ---
> hw/s390x/css.c | 21 ++++++++-------------
> hw/s390x/css.h | 1 -
> hw/s390x/virtio-ccw.c | 1 -
> 3 files changed, 8 insertions(+), 15 deletions(-)
>
> diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> index 7074d2b..122cc7e 100644
> --- a/hw/s390x/css.c
> +++ b/hw/s390x/css.c
> @@ -140,7 +140,6 @@ static void sch_handle_clear_func(SubchDev *sch)
> s->flags &= ~SCSW_FLAGS_MASK_PNO;
>
> /* We always 'attempt to issue the clear signal', and we always succeed.
> */
> - sch->orb = NULL;
> sch->channel_prog = 0x0;
> sch->last_cmd_valid = false;
> s->ctrl &= ~SCSW_ACTL_CLEAR_PEND;
> @@ -163,7 +162,6 @@ static void sch_handle_halt_func(SubchDev *sch)
> path = 0x80;
>
> /* We always 'attempt to issue the halt signal', and we always succeed.
> */
> - sch->orb = NULL;
> sch->channel_prog = 0x0;
> sch->last_cmd_valid = false;
> s->ctrl &= ~SCSW_ACTL_HALT_PEND;
> @@ -317,12 +315,11 @@ static int css_interpret_ccw(SubchDev *sch, hwaddr
> ccw_addr)
> return ret;
> }
>
> -static void sch_handle_start_func(SubchDev *sch)
> +static void sch_handle_start_func(SubchDev *sch, ORB *orb)
> {
>
> PMCW *p = &sch->curr_status.pmcw;
> SCSW *s = &sch->curr_status.scsw;
> - ORB *orb = sch->orb;
> int path;
> int ret;
>
> @@ -331,6 +328,7 @@ static void sch_handle_start_func(SubchDev *sch)
>
> if (!(s->ctrl & SCSW_ACTL_SUSP)) {
> /* Look at the orb and try to execute the channel program. */
> + assert(orb != NULL); /* resume does not pass an orb */
> p->intparm = orb->intparm;
> if (!(orb->lpm & path)) {
> /* Generate a deferred cc 3 condition. */
> @@ -406,7 +404,7 @@ static void sch_handle_start_func(SubchDev *sch)
> * read/writes) asynchronous later on if we start supporting more than
> * our current very simple devices.
> */
> -static void do_subchannel_work(SubchDev *sch)
> +static void do_subchannel_work(SubchDev *sch, ORB *orb)
> {
>
> SCSW *s = &sch->curr_status.scsw;
> @@ -416,7 +414,7 @@ static void do_subchannel_work(SubchDev *sch)
> } else if (s->ctrl & SCSW_FCTL_HALT_FUNC) {
> sch_handle_halt_func(sch);
> } else if (s->ctrl & SCSW_FCTL_START_FUNC) {
> - sch_handle_start_func(sch);
> + sch_handle_start_func(sch, orb);
> } else {
> /* Cannot happen. */
> return;
> @@ -594,7 +592,6 @@ int css_do_xsch(SubchDev *sch)
> SCSW_ACTL_SUSP);
> sch->channel_prog = 0x0;
> sch->last_cmd_valid = false;
> - sch->orb = NULL;
> s->dstat = 0;
> s->cstat = 0;
> ret = 0;
> @@ -618,7 +615,7 @@ int css_do_csch(SubchDev *sch)
> s->ctrl &= ~(SCSW_CTRL_MASK_FCTL | SCSW_CTRL_MASK_ACTL);
> s->ctrl |= SCSW_FCTL_CLEAR_FUNC | SCSW_FCTL_CLEAR_FUNC;
>
> - do_subchannel_work(sch);
> + do_subchannel_work(sch, NULL);
> ret = 0;
>
> out:
> @@ -659,7 +656,7 @@ int css_do_hsch(SubchDev *sch)
> }
> s->ctrl |= SCSW_ACTL_HALT_PEND;
>
> - do_subchannel_work(sch);
> + do_subchannel_work(sch, NULL);
> ret = 0;
>
> out:
> @@ -721,13 +718,12 @@ int css_do_ssch(SubchDev *sch, ORB *orb)
> if (channel_subsys->chnmon_active) {
> css_update_chnmon(sch);
> }
> - sch->orb = orb;
> sch->channel_prog = orb->cpa;
> /* Trigger the start function. */
> s->ctrl |= (SCSW_FCTL_START_FUNC | SCSW_ACTL_START_PEND);
> s->flags &= ~SCSW_FLAGS_MASK_PNO;
>
> - do_subchannel_work(sch);
> + do_subchannel_work(sch, orb);
> ret = 0;
>
> out:
> @@ -957,7 +953,7 @@ int css_do_rsch(SubchDev *sch)
> }
>
> s->ctrl |= SCSW_ACTL_RESUME_PEND;
> - do_subchannel_work(sch);
> + do_subchannel_work(sch, NULL);
> ret = 0;
>
> out:
> @@ -1267,7 +1263,6 @@ void css_reset_sch(SubchDev *sch)
>
> sch->channel_prog = 0x0;
> sch->last_cmd_valid = false;
> - sch->orb = NULL;
> sch->thinint_active = false;
> }
>
> diff --git a/hw/s390x/css.h b/hw/s390x/css.h
> index e9b4405..220169e 100644
> --- a/hw/s390x/css.h
> +++ b/hw/s390x/css.h
> @@ -76,7 +76,6 @@ struct SubchDev {
> hwaddr channel_prog;
> CCW1 last_cmd;
> bool last_cmd_valid;
> - ORB *orb;
> bool thinint_active;
> /* transport-provided data: */
> int (*ccw_cb) (SubchDev *, CCW1);
> diff --git a/hw/s390x/virtio-ccw.c b/hw/s390x/virtio-ccw.c
> index 2bf0af8..1cb4e2c 100644
> --- a/hw/s390x/virtio-ccw.c
> +++ b/hw/s390x/virtio-ccw.c
> @@ -559,7 +559,6 @@ static int virtio_ccw_device_init(VirtioCcwDevice *dev,
> VirtIODevice *vdev)
> /* Initialize subchannel structure. */
> sch->channel_prog = 0x0;
> sch->last_cmd_valid = false;
> - sch->orb = NULL;
> sch->thinint_active = false;
> /*
> * Use a device number if provided. Otherwise, fall back to subchannel
>