Re: [PATCH 2/3] s390: Virtual channel subsystem support.

2012-11-20 Thread Cornelia Huck
On Mon, 19 Nov 2012 14:30:00 +0100
Alexander Graf  wrote:

> 
> On 31.10.2012, at 17:24, Cornelia Huck wrote:
> 
> > Provide a mechanism for qemu to provide fully virtual subchannels to
> > the guest. In the KVM case, this relies on the kernel's css support
> > for I/O and machine check interrupt handling. The !KVM case handles
> > interrupts on its own.
> > 
> > Signed-off-by: Cornelia Huck 
> > ---
> > hw/s390x/Makefile.objs |1 +
> > hw/s390x/css.c | 1209 
> > 
> > hw/s390x/css.h |   90 
> > target-s390x/Makefile.objs |2 +-
> > target-s390x/cpu.h |  232 +
> > target-s390x/helper.c  |  146 ++
> > target-s390x/ioinst.c  |  737 +++
> > target-s390x/ioinst.h  |  213 
> > target-s390x/kvm.c |  251 -
> > target-s390x/misc_helper.c |6 +-
> > 10 files changed, 2872 insertions(+), 15 deletions(-)
> > create mode 100644 hw/s390x/css.c
> > create mode 100644 hw/s390x/css.h
> > create mode 100644 target-s390x/ioinst.c
> > create mode 100644 target-s390x/ioinst.h
> > 
> > diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
> > index 096dfcd..378b099 100644
> > --- a/hw/s390x/Makefile.objs
> > +++ b/hw/s390x/Makefile.objs
> > @@ -4,3 +4,4 @@ obj-y := $(addprefix ../,$(obj-y))
> > obj-y += sclp.o
> > obj-y += event-facility.o
> > obj-y += sclpquiesce.o sclpconsole.o
> > +obj-y += css.o
> > diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> > new file mode 100644
> > index 000..9adffb3
> > --- /dev/null
> > +++ b/hw/s390x/css.c
> > @@ -0,0 +1,1209 @@
> > +/*
> > + * Channel subsystem base support.
> > + *
> > + * Copyright 2012 IBM Corp.
> > + * Author(s): Cornelia Huck 
> > + *
> > + * This work is licensed under the terms of the GNU GPL, version 2 or (at
> > + * your option) any later version. See the COPYING file in the top-level
> > + * directory.
> > + */
> > +
> > +#include "qemu-thread.h"
> > +#include "qemu-queue.h"
> > +#include 
> > +#include "bitops.h"
> > +#include "kvm.h"
> > +#include "cpu.h"
> > +#include "ioinst.h"
> > +#include "css.h"
> > +#include "virtio-ccw.h"
> > +
> > +typedef struct CrwContainer {
> > +CRW crw;
> > +QTAILQ_ENTRY(CrwContainer) sibling;
> > +} CrwContainer;
> > +
> > +typedef struct ChpInfo {
> > +uint8_t in_use;
> > +uint8_t type;
> > +uint8_t is_virtual;
> > +} ChpInfo;
> > +
> > +typedef struct SubchSet {
> > +SubchDev *sch[MAX_SCHID + 1];
> > +unsigned long schids_used[BITS_TO_LONGS(MAX_SCHID + 1)];
> > +unsigned long devnos_used[BITS_TO_LONGS(MAX_SCHID + 1)];
> > +} SubchSet;
> > +
> > +typedef struct CssImage {
> > +SubchSet *sch_set[MAX_SSID + 1];
> > +ChpInfo chpids[MAX_CHPID + 1];
> > +} CssImage;
> > +
> > +typedef struct ChannelSubSys {
> > +QTAILQ_HEAD(, CrwContainer) pending_crws;
> > +bool do_crw_mchk;
> > +bool crws_lost;
> > +uint8_t max_cssid;
> > +uint8_t max_ssid;
> > +bool chnmon_active;
> > +uint64_t chnmon_area;
> > +CssImage *css[MAX_CSSID + 1];
> > +uint8_t default_cssid;
> > +} ChannelSubSys;
> > +
> > +static ChannelSubSys *channel_subsys;
> > +
> > +int css_create_css_image(uint8_t cssid, bool default_image)
> > +{
> > +if (cssid > MAX_CSSID) {
> > +return -EINVAL;
> > +}
> > +if (channel_subsys->css[cssid]) {
> > +return -EBUSY;
> > +}
> > +channel_subsys->css[cssid] = g_try_malloc0(sizeof(CssImage));
> > +if (!channel_subsys->css[cssid]) {
> > +return -ENOMEM;
> > +}
> > +if (default_image) {
> > +channel_subsys->default_cssid = cssid;
> > +}
> > +return 0;
> > +}
> > +
> > +static void css_write_phys_pmcw(uint64_t addr, PMCW *pmcw)
> > +{
> > +int i;
> > +uint32_t offset = 0;
> > +struct copy_pmcw {
> > +uint32_t intparm;
> > +uint16_t flags;
> > +uint16_t devno;
> > +uint8_t lpm;
> > +uint8_t pnom;
> > +uint8_t lpum;
> > +uint8_t pim;
> > +uint16_t mbi;
> > +uint8_t pom;
> > +uint8_t pam;
> > +uint8_t chpid[8];
> > +uint32_t chars;
> > +} *copy;
> 
> This needs to be packed. Also, it might be a good idea to separate the struct 
> definition from the actual code ;).
> 
> > +
> > +copy = (struct copy_pmcw *)pmcw;
> 
> This will break on any system that doesn't coincidently stick to the same 
> bitfield order as s390x. Please drop any usage of bitfields in QEMU source 
> code :).
> 
> > +stl_phys(addr + offset, copy->intparm);
> > +offset += sizeof(copy->intparm);
> 
> Can't you just use cpu_physical_memory_map() and assign things left and right 
> as you see fit? Or prepare the target endianness struct on the stack and 
> cpu_physical_memory_read/write it from/to guest memory.

All that copying stuff (other places as well) was still on my todo list
- just wanted to get the patches out of the door so people could 

Re: [PATCH 2/3] s390: Virtual channel subsystem support.

2012-11-19 Thread Alexander Graf

On 31.10.2012, at 17:24, Cornelia Huck wrote:

> Provide a mechanism for qemu to provide fully virtual subchannels to
> the guest. In the KVM case, this relies on the kernel's css support
> for I/O and machine check interrupt handling. The !KVM case handles
> interrupts on its own.
> 
> Signed-off-by: Cornelia Huck 
> ---
> hw/s390x/Makefile.objs |1 +
> hw/s390x/css.c | 1209 
> hw/s390x/css.h |   90 
> target-s390x/Makefile.objs |2 +-
> target-s390x/cpu.h |  232 +
> target-s390x/helper.c  |  146 ++
> target-s390x/ioinst.c  |  737 +++
> target-s390x/ioinst.h  |  213 
> target-s390x/kvm.c |  251 -
> target-s390x/misc_helper.c |6 +-
> 10 files changed, 2872 insertions(+), 15 deletions(-)
> create mode 100644 hw/s390x/css.c
> create mode 100644 hw/s390x/css.h
> create mode 100644 target-s390x/ioinst.c
> create mode 100644 target-s390x/ioinst.h
> 
> diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs
> index 096dfcd..378b099 100644
> --- a/hw/s390x/Makefile.objs
> +++ b/hw/s390x/Makefile.objs
> @@ -4,3 +4,4 @@ obj-y := $(addprefix ../,$(obj-y))
> obj-y += sclp.o
> obj-y += event-facility.o
> obj-y += sclpquiesce.o sclpconsole.o
> +obj-y += css.o
> diff --git a/hw/s390x/css.c b/hw/s390x/css.c
> new file mode 100644
> index 000..9adffb3
> --- /dev/null
> +++ b/hw/s390x/css.c
> @@ -0,0 +1,1209 @@
> +/*
> + * Channel subsystem base support.
> + *
> + * Copyright 2012 IBM Corp.
> + * Author(s): Cornelia Huck 
> + *
> + * This work is licensed under the terms of the GNU GPL, version 2 or (at
> + * your option) any later version. See the COPYING file in the top-level
> + * directory.
> + */
> +
> +#include "qemu-thread.h"
> +#include "qemu-queue.h"
> +#include 
> +#include "bitops.h"
> +#include "kvm.h"
> +#include "cpu.h"
> +#include "ioinst.h"
> +#include "css.h"
> +#include "virtio-ccw.h"
> +
> +typedef struct CrwContainer {
> +CRW crw;
> +QTAILQ_ENTRY(CrwContainer) sibling;
> +} CrwContainer;
> +
> +typedef struct ChpInfo {
> +uint8_t in_use;
> +uint8_t type;
> +uint8_t is_virtual;
> +} ChpInfo;
> +
> +typedef struct SubchSet {
> +SubchDev *sch[MAX_SCHID + 1];
> +unsigned long schids_used[BITS_TO_LONGS(MAX_SCHID + 1)];
> +unsigned long devnos_used[BITS_TO_LONGS(MAX_SCHID + 1)];
> +} SubchSet;
> +
> +typedef struct CssImage {
> +SubchSet *sch_set[MAX_SSID + 1];
> +ChpInfo chpids[MAX_CHPID + 1];
> +} CssImage;
> +
> +typedef struct ChannelSubSys {
> +QTAILQ_HEAD(, CrwContainer) pending_crws;
> +bool do_crw_mchk;
> +bool crws_lost;
> +uint8_t max_cssid;
> +uint8_t max_ssid;
> +bool chnmon_active;
> +uint64_t chnmon_area;
> +CssImage *css[MAX_CSSID + 1];
> +uint8_t default_cssid;
> +} ChannelSubSys;
> +
> +static ChannelSubSys *channel_subsys;
> +
> +int css_create_css_image(uint8_t cssid, bool default_image)
> +{
> +if (cssid > MAX_CSSID) {
> +return -EINVAL;
> +}
> +if (channel_subsys->css[cssid]) {
> +return -EBUSY;
> +}
> +channel_subsys->css[cssid] = g_try_malloc0(sizeof(CssImage));
> +if (!channel_subsys->css[cssid]) {
> +return -ENOMEM;
> +}
> +if (default_image) {
> +channel_subsys->default_cssid = cssid;
> +}
> +return 0;
> +}
> +
> +static void css_write_phys_pmcw(uint64_t addr, PMCW *pmcw)
> +{
> +int i;
> +uint32_t offset = 0;
> +struct copy_pmcw {
> +uint32_t intparm;
> +uint16_t flags;
> +uint16_t devno;
> +uint8_t lpm;
> +uint8_t pnom;
> +uint8_t lpum;
> +uint8_t pim;
> +uint16_t mbi;
> +uint8_t pom;
> +uint8_t pam;
> +uint8_t chpid[8];
> +uint32_t chars;
> +} *copy;

This needs to be packed. Also, it might be a good idea to separate the struct 
definition from the actual code ;).

> +
> +copy = (struct copy_pmcw *)pmcw;

This will break on any system that doesn't coincidently stick to the same 
bitfield order as s390x. Please drop any usage of bitfields in QEMU source code 
:).

> +stl_phys(addr + offset, copy->intparm);
> +offset += sizeof(copy->intparm);

Can't you just use cpu_physical_memory_map() and assign things left and right 
as you see fit? Or prepare the target endianness struct on the stack and 
cpu_physical_memory_read/write it from/to guest memory.

Also, please split this patch into smaller patches :). As it is now it's very 
hard to review. However, apart from the above issues (which may happen in other 
places of the code further down, I just didn't comment then) I couldn't see 
major problems so far. But please split it nevertheless so that I have an 
easier time reviewing it :)


Alex

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger

Re: [PATCH 2/3] s390: Virtual channel subsystem support.

2012-11-13 Thread Cornelia Huck
On Mon, 12 Nov 2012 23:17:55 -0200
Marcelo Tosatti  wrote:

> Hi Cornelia,
> 
> On Wed, Oct 31, 2012 at 05:24:47PM +0100, Cornelia Huck wrote:
> > Provide a mechanism for qemu to provide fully virtual subchannels to
> > the guest. In the KVM case, this relies on the kernel's css support
> > for I/O and machine check interrupt handling. The !KVM case handles
> > interrupts on its own.
> > 
> > Signed-off-by: Cornelia Huck 
> > ---
> >  hw/s390x/Makefile.objs |1 +
> >  hw/s390x/css.c | 1209 
> > 
> >  hw/s390x/css.h |   90 
> >  target-s390x/Makefile.objs |2 +-
> >  target-s390x/cpu.h |  232 +
> >  target-s390x/helper.c  |  146 ++
> >  target-s390x/ioinst.c  |  737 +++
> >  target-s390x/ioinst.h  |  213 
> >  target-s390x/kvm.c |  251 -
> >  target-s390x/misc_helper.c |6 +-
> >  10 files changed, 2872 insertions(+), 15 deletions(-)
> >  create mode 100644 hw/s390x/css.c
> >  create mode 100644 hw/s390x/css.h
> >  create mode 100644 target-s390x/ioinst.c
> >  create mode 100644 target-s390x/ioinst.h
> 
> > +void kvm_s390_enable_css_support(CPUS390XState *env)
> > +{
> > +struct kvm_enable_cap cap = {};
> > +int r;
> > +
> > +/* Activate host kernel channel subsystem support. */
> > +if (kvm_enabled()) {
> > +/* One CPU has to run */
> > +s390_add_running_cpu(env);
> 
> Care to explain this?

Old code leftovers; I've removed it.

> 
> > +
> > +cap.cap = KVM_CAP_S390_CSS_SUPPORT;
> > +r = kvm_vcpu_ioctl(env, KVM_ENABLE_CAP, &cap);
> > +assert(r == 0);
> > +}
> > +}
> 
> 

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/3] s390: Virtual channel subsystem support.

2012-11-12 Thread Marcelo Tosatti
Hi Cornelia,

On Wed, Oct 31, 2012 at 05:24:47PM +0100, Cornelia Huck wrote:
> Provide a mechanism for qemu to provide fully virtual subchannels to
> the guest. In the KVM case, this relies on the kernel's css support
> for I/O and machine check interrupt handling. The !KVM case handles
> interrupts on its own.
> 
> Signed-off-by: Cornelia Huck 
> ---
>  hw/s390x/Makefile.objs |1 +
>  hw/s390x/css.c | 1209 
> 
>  hw/s390x/css.h |   90 
>  target-s390x/Makefile.objs |2 +-
>  target-s390x/cpu.h |  232 +
>  target-s390x/helper.c  |  146 ++
>  target-s390x/ioinst.c  |  737 +++
>  target-s390x/ioinst.h  |  213 
>  target-s390x/kvm.c |  251 -
>  target-s390x/misc_helper.c |6 +-
>  10 files changed, 2872 insertions(+), 15 deletions(-)
>  create mode 100644 hw/s390x/css.c
>  create mode 100644 hw/s390x/css.h
>  create mode 100644 target-s390x/ioinst.c
>  create mode 100644 target-s390x/ioinst.h

> +void kvm_s390_enable_css_support(CPUS390XState *env)
> +{
> +struct kvm_enable_cap cap = {};
> +int r;
> +
> +/* Activate host kernel channel subsystem support. */
> +if (kvm_enabled()) {
> +/* One CPU has to run */
> +s390_add_running_cpu(env);

Care to explain this?

> +
> +cap.cap = KVM_CAP_S390_CSS_SUPPORT;
> +r = kvm_vcpu_ioctl(env, KVM_ENABLE_CAP, &cap);
> +assert(r == 0);
> +}
> +}


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html