All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm
@ 2016-09-27 11:48 Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 1/8] s390x/pci: re-arrange variable declarations Christian Borntraeger
                   ` (7 more replies)
  0 siblings, 8 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Christian Borntraeger

Here is the next bunch of s390 patches.
I plan to send a pull request at the end of the week.

Code can also be found on

  git://github.com/borntraeger/qemu.git tags/s390x-20160927

----------------------------------------------------------------
Couple of s390x patches:
- some PCI cleanups
- fix build error due to uuid rework
- fix potential deadlock in sigp handling
- enable ccw devices in BIOS and enforce checking in QEMU

----------------------------------------------------------------
Christian Borntraeger (3):
      s390x/kvm: Fix potential deadlock in sigp handling
      pc-bios/s390-ccw.img: rebuild image
      s390x/kvm: fix build against qemu_uuid

Dong Jia Shi (1):
      pc-bios/s390-ccw: enable subchannel for IPL I/O devices

Pierre Morel (1):
      s390x/pci: re-arrange variable declarations

Sascha Silbe (1):
      s390x/css: {c,h,t,r,x}sch: require enable AND device number valid

Yi Min Zhao (2):
      s390x/pci: assign msix io region for each pci device
      s390x/pci: code cleanup

 hw/s390x/css.c            |  12 ++++++------
 hw/s390x/s390-pci-bus.c   |  48 +++++++++++++++++++++++++---------------------
 hw/s390x/s390-pci-bus.h   |   4 ++--
 hw/s390x/s390-pci-inst.c  |   6 ++++--
 pc-bios/s390-ccw.img      | Bin 26440 -> 26392 bytes
 pc-bios/s390-ccw/virtio.c |   3 ++-
 target-s390x/kvm.c        |  13 ++++++++++++-
 7 files changed, 52 insertions(+), 34 deletions(-)

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 1/8] s390x/pci: re-arrange variable declarations
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 2/8] s390x/pci: assign msix io region for each pci device Christian Borntraeger
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Pierre Morel,
	Christian Borntraeger

From: Pierre Morel <pmorel@linux.vnet.ibm.com>

Pull mr variable declarations at the top of the functions instead of
mixing them up with the code. This is in preparation for followup
patches.

Signed-off-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 hw/s390x/s390-pci-inst.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c
index f069b11..80a5104 100644
--- a/hw/s390x/s390-pci-inst.c
+++ b/hw/s390x/s390-pci-inst.c
@@ -315,6 +315,7 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
     S390PCIBusDevice *pbdev;
     uint64_t offset;
     uint64_t data;
+    MemoryRegion *mr;
     uint8_t len;
     uint32_t fh;
     uint8_t pcias;
@@ -363,7 +364,7 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
             program_interrupt(env, PGM_OPERAND, 4);
             return 0;
         }
-        MemoryRegion *mr = pbdev->pdev->io_regions[pcias].memory;
+        mr = pbdev->pdev->io_regions[pcias].memory;
         memory_region_dispatch_read(mr, offset, &data, len,
                                     MEMTXATTRS_UNSPECIFIED);
     } else if (pcias == 15) {
@@ -442,6 +443,7 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
     CPUS390XState *env = &cpu->env;
     uint64_t offset, data;
     S390PCIBusDevice *pbdev;
+    MemoryRegion *mr;
     uint8_t len;
     uint32_t fh;
     uint8_t pcias;
@@ -491,7 +493,7 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint8_t r2)
             program_interrupt(env, PGM_OPERAND, 4);
             return 0;
         }
-        MemoryRegion *mr;
+
         if (trap_msix(pbdev, offset, pcias)) {
             offset = offset - pbdev->msix.table_offset;
             mr = &pbdev->pdev->msix_table_mmio;
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 2/8] s390x/pci: assign msix io region for each pci device
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 1/8] s390x/pci: re-arrange variable declarations Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 3/8] s390x/pci: code cleanup Christian Borntraeger
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Yi Min Zhao,
	Christian Borntraeger

From: Yi Min Zhao <zyimin@linux.vnet.ibm.com>

For efficiency we now assign one msix io region for each pci device
and provide it with the pointer to the zPCI device as opaque
parameter. In addition, we remove msix address space and add msix io
region as a subregion to the root memory region of pci device.

Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 hw/s390x/s390-pci-bus.c | 37 ++++++++++++++++++++++++++-----------
 hw/s390x/s390-pci-bus.h |  4 ++--
 2 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index ac8f06d..fe5fc4e 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -383,7 +383,6 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr,
     uint64_t pte;
     uint32_t flags;
     S390PCIBusDevice *pbdev = container_of(iommu, S390PCIBusDevice, iommu_mr);
-    S390pciState *s;
     IOMMUTLBEntry ret = {
         .target_as = &address_space_memory,
         .iova = 0,
@@ -405,12 +404,10 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr,
 
     DPRINTF("iommu trans addr 0x%" PRIx64 "\n", addr);
 
-    s = S390_PCI_HOST_BRIDGE(pci_device_root_bus(pbdev->pdev)->qbus.parent);
     /* s390 does not have an APIC mapped to main storage so we use
      * a separate AddressSpace only for msix notifications
      */
     if (addr == ZPCI_MSI_ADDR) {
-        ret.target_as = &s->msix_notify_as;
         ret.iova = addr;
         ret.translated_addr = addr;
         ret.addr_mask = 0xfff;
@@ -476,7 +473,7 @@ static uint8_t set_ind_atomic(uint64_t ind_loc, uint8_t to_be_set)
 static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data,
                                 unsigned int size)
 {
-    S390PCIBusDevice *pbdev;
+    S390PCIBusDevice *pbdev = opaque;
     uint32_t io_int_word;
     uint32_t idx = data >> ZPCI_MSI_VEC_BITS;
     uint32_t vec = data & ZPCI_MSI_VEC_MASK;
@@ -486,7 +483,6 @@ static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data,
 
     DPRINTF("write_msix data 0x%" PRIx64 " idx %d vec 0x%x\n", data, idx, vec);
 
-    pbdev = s390_pci_find_dev_by_idx(idx);
     if (!pbdev) {
         e |= (vec << ERR_EVENT_MVN_OFFSET);
         s390_pci_generate_error_event(ERR_EVENT_NOMSI, idx, 0, addr, e);
@@ -548,10 +544,6 @@ static void s390_pcihost_init_as(S390pciState *s)
 
         s->iommu[i] = iommu;
     }
-
-    memory_region_init_io(&s->msix_notify_mr, OBJECT(s),
-                          &s390_msi_ctrl_ops, s, "msix-s390", UINT64_MAX);
-    address_space_init(&s->msix_notify_as, &s->msix_notify_mr, "msix-pci");
 }
 
 static int s390_pcihost_init(SysBusDevice *dev)
@@ -581,7 +573,7 @@ static int s390_pcihost_init(SysBusDevice *dev)
     return 0;
 }
 
-static int s390_pcihost_setup_msix(S390PCIBusDevice *pbdev)
+static int s390_pci_setup_msix(S390PCIBusDevice *pbdev)
 {
     uint8_t pos;
     uint16_t ctrl;
@@ -609,6 +601,26 @@ static int s390_pcihost_setup_msix(S390PCIBusDevice *pbdev)
     return 0;
 }
 
+static void s390_pci_msix_init(S390PCIBusDevice *pbdev)
+{
+    char *name;
+
+    name = g_strdup_printf("msix-s390-%04x", pbdev->uid);
+
+    memory_region_init_io(&pbdev->msix_notify_mr, OBJECT(pbdev),
+                          &s390_msi_ctrl_ops, pbdev, name, PAGE_SIZE);
+    memory_region_add_subregion(&pbdev->iommu->mr, ZPCI_MSI_ADDR,
+                                &pbdev->msix_notify_mr);
+
+    g_free(name);
+}
+
+static void s390_pci_msix_free(S390PCIBusDevice *pbdev)
+{
+    memory_region_del_subregion(&pbdev->iommu->mr, &pbdev->msix_notify_mr);
+    object_unparent(OBJECT(&pbdev->msix_notify_mr));
+}
+
 static S390PCIBusDevice *s390_pci_device_new(const char *target)
 {
     DeviceState *dev = NULL;
@@ -662,7 +674,9 @@ static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
         pbdev->pdev = pdev;
         pbdev->iommu = s->iommu[PCI_SLOT(pdev->devfn)];
         pbdev->state = ZPCI_FS_STANDBY;
-        s390_pcihost_setup_msix(pbdev);
+
+        s390_pci_msix_init(pbdev);
+        s390_pci_setup_msix(pbdev);
 
         if (dev->hotplugged) {
             s390_pci_generate_plug_event(HP_EVENT_RESERVED_TO_STANDBY,
@@ -749,6 +763,7 @@ static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
     s390_pci_generate_plug_event(HP_EVENT_STANDBY_TO_RESERVED,
                                  pbdev->fh, pbdev->fid);
     object_unparent(OBJECT(pci_dev));
+    s390_pci_msix_free(pbdev);
     pbdev->pdev = NULL;
     pbdev->state = ZPCI_FS_RESERVED;
 out:
diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h
index 4f564e0..7f27013 100644
--- a/hw/s390x/s390-pci-bus.h
+++ b/hw/s390x/s390-pci-bus.h
@@ -82,6 +82,7 @@
 #define ZPCI_EDMA_ADDR 0x1ffffffffffffffULL
 
 #define PAGE_SHIFT      12
+#define PAGE_SIZE       (1 << PAGE_SHIFT)
 #define PAGE_MASK       (~(PAGE_SIZE-1))
 #define PAGE_DEFAULT_ACC        0
 #define PAGE_DEFAULT_KEY        (PAGE_DEFAULT_ACC << 4)
@@ -283,6 +284,7 @@ typedef struct S390PCIBusDevice {
     AdapterRoutes routes;
     S390PCIIOMMU *iommu;
     MemoryRegion iommu_mr;
+    MemoryRegion msix_notify_mr;
     IndAddr *summary_ind;
     IndAddr *indicator;
     QEMUTimer *release_timer;
@@ -297,8 +299,6 @@ typedef struct S390pciState {
     S390PCIBus *bus;
     S390PCIBusDevice *pbdev[PCI_SLOT_MAX];
     S390PCIIOMMU *iommu[PCI_SLOT_MAX];
-    AddressSpace msix_notify_as;
-    MemoryRegion msix_notify_mr;
     QTAILQ_HEAD(, SeiContainer) pending_sei;
 } S390pciState;
 
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 3/8] s390x/pci: code cleanup
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 1/8] s390x/pci: re-arrange variable declarations Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 2/8] s390x/pci: assign msix io region for each pci device Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 4/8] s390x/kvm: Fix potential deadlock in sigp handling Christian Borntraeger
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Yi Min Zhao,
	Christian Borntraeger

From: Yi Min Zhao <zyimin@linux.vnet.ibm.com>

Now that each S390 PCI device uses an IO region as MSIX region. The
code in s390_translate_iommu() will never be triggered. Let's remove
it.

Signed-off-by: Yi Min Zhao <zyimin@linux.vnet.ibm.com>
Reviewed-by: Pierre Morel <pmorel@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 hw/s390x/s390-pci-bus.c | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c
index fe5fc4e..b7f8bca 100644
--- a/hw/s390x/s390-pci-bus.c
+++ b/hw/s390x/s390-pci-bus.c
@@ -404,17 +404,6 @@ static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *iommu, hwaddr addr,
 
     DPRINTF("iommu trans addr 0x%" PRIx64 "\n", addr);
 
-    /* s390 does not have an APIC mapped to main storage so we use
-     * a separate AddressSpace only for msix notifications
-     */
-    if (addr == ZPCI_MSI_ADDR) {
-        ret.iova = addr;
-        ret.translated_addr = addr;
-        ret.addr_mask = 0xfff;
-        ret.perm = IOMMU_RW;
-        return ret;
-    }
-
     if (addr < pbdev->pba || addr > pbdev->pal) {
         return ret;
     }
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 4/8] s390x/kvm: Fix potential deadlock in sigp handling
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
                   ` (2 preceding siblings ...)
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 3/8] s390x/pci: code cleanup Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 5/8] pc-bios/s390-ccw: enable subchannel for IPL I/O devices Christian Borntraeger
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Christian Borntraeger

If two VCPUs exit at the same time and target each other
with a sigp, both could run into a deadlock as run_on_cpu
on CPU0 will free the BQL when starting the CPU1 target routine.
CPU1 will run its sigp initiater for CPU0 before handling
the run_on_cpu requests, thus resulting in a dead lock.

As all qemu SIGPs are slow path anway we can use a big sigp
lock and allow only one SIGP for the guest at a time. We will
return condition code 2 (BUSY) on contention to the guest.

Reported-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 target-s390x/kvm.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index 4b847a3..a95d3da 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -132,6 +132,8 @@ const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
     KVM_CAP_LAST_INFO
 };
 
+static QemuMutex qemu_sigp_mutex;
+
 static int cap_sync_regs;
 static int cap_async_pf;
 static int cap_mem_op;
@@ -287,6 +289,8 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
         }
     }
 
+    qemu_mutex_init(&qemu_sigp_mutex);
+
     return 0;
 }
 
@@ -1774,6 +1778,11 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
     status_reg = &env->regs[r1];
     param = (r1 % 2) ? env->regs[r1] : env->regs[r1 + 1];
 
+    if (qemu_mutex_trylock(&qemu_sigp_mutex)) {
+        ret = SIGP_CC_BUSY;
+        goto out;
+    }
+
     switch (order) {
     case SIGP_SET_ARCH:
         ret = sigp_set_architecture(cpu, param, status_reg);
@@ -1783,7 +1792,9 @@ static int handle_sigp(S390CPU *cpu, struct kvm_run *run, uint8_t ipa1)
         dst_cpu = s390_cpu_addr2state(env->regs[r3]);
         ret = handle_sigp_single_dst(dst_cpu, order, param, status_reg);
     }
+    qemu_mutex_unlock(&qemu_sigp_mutex);
 
+out:
     trace_kvm_sigp_finished(order, CPU(cpu)->cpu_index,
                             dst_cpu ? CPU(dst_cpu)->cpu_index : -1, ret);
 
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 5/8] pc-bios/s390-ccw: enable subchannel for IPL I/O devices
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
                   ` (3 preceding siblings ...)
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 4/8] s390x/kvm: Fix potential deadlock in sigp handling Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 6/8] pc-bios/s390-ccw.img: rebuild image Christian Borntraeger
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Dong Jia Shi,
	Halil Pasic, Christian Borntraeger

From: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>

IPL should cause the IPL I/O device to become enabled. So when handling
the IPL program, we should set the E (Enable) bit. However, virtio-ccw
does not know whether it's dealing with an IPL device or not. Since
trying to perform I/O on a disabled device doesn't make any sense,
let's just always enable it. At the same time we can remove the
SCSW_FCTL_START_FUNC flag as it is ignored for msch anyway and did
not enable the device as intended.

Reported-by: Farhan Ali <alifm@linux.vnet.ibm.com>
Signed-off-by: Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Signed-off-by: Halil Pasic <pasic@linux.vnet.ibm.com>
[remove superfluous flag]
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 pc-bios/s390-ccw/virtio.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c
index 1d34e8c..b333734 100644
--- a/pc-bios/s390-ccw/virtio.c
+++ b/pc-bios/s390-ccw/virtio.c
@@ -97,7 +97,8 @@ static int run_ccw(VDev *vdev, int cmd, void *ptr, int len)
 
     /* start command processing */
     stsch_err(vdev->schid, &schib);
-    schib.scsw.ctrl = SCSW_FCTL_START_FUNC;
+    /* enable the subchannel for IPL device */
+    schib.pmcw.ena = 1;
     msch(vdev->schid, &schib);
 
     /* start subchannel command */
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 6/8] pc-bios/s390-ccw.img: rebuild image
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
                   ` (4 preceding siblings ...)
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 5/8] pc-bios/s390-ccw: enable subchannel for IPL I/O devices Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 7/8] s390x/css: {c, h, t, r, x}sch: require enable AND device number valid Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 8/8] s390x/kvm: fix build against qemu_uuid Christian Borntraeger
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Christian Borntraeger

Contains:
- pc-bios/s390-ccw: enable subchannel for IPL I/O devices

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 pc-bios/s390-ccw.img | Bin 26440 -> 26392 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/pc-bios/s390-ccw.img b/pc-bios/s390-ccw.img
index 089f6ba5e924c17796cccac4ecbfa7a78b00ba22..cf05bf0be2299ec6512375ef4b38179f22558ddc 100644
GIT binary patch
literal 26392
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

literal 26440
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
Xo=W;!<5E}TXQfTAJ+c*b8(;ii*wE%J

-- 
2.5.5

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 7/8] s390x/css: {c, h, t, r, x}sch: require enable AND device number valid
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
                   ` (5 preceding siblings ...)
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 6/8] pc-bios/s390-ccw.img: rebuild image Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 8/8] s390x/kvm: fix build against qemu_uuid Christian Borntraeger
  7 siblings, 0 replies; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf, Sascha Silbe,
	Christian Borntraeger

From: Sascha Silbe <silbe@linux.vnet.ibm.com>

According to the PoP, subchannels are only considered operational if
they are enabled _and_ the device number is valid. With the current
checks being enabled _or_ having a valid device number was
sufficient. This caused qemu to allow IO on subchannels that were not
enabled.

Fix the checks to require both bits to be set.

Signed-off-by: Sascha Silbe <silbe@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: Halil Pasic <pasic@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 hw/s390x/css.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/hw/s390x/css.c b/hw/s390x/css.c
index b0e81ef..0f2580d 100644
--- a/hw/s390x/css.c
+++ b/hw/s390x/css.c
@@ -775,7 +775,7 @@ int css_do_xsch(SubchDev *sch)
     PMCW *p = &sch->curr_status.pmcw;
     int ret;
 
-    if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) {
+    if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) {
         ret = -ENODEV;
         goto out;
     }
@@ -815,7 +815,7 @@ int css_do_csch(SubchDev *sch)
     PMCW *p = &sch->curr_status.pmcw;
     int ret;
 
-    if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) {
+    if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) {
         ret = -ENODEV;
         goto out;
     }
@@ -837,7 +837,7 @@ int css_do_hsch(SubchDev *sch)
     PMCW *p = &sch->curr_status.pmcw;
     int ret;
 
-    if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) {
+    if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) {
         ret = -ENODEV;
         goto out;
     }
@@ -913,7 +913,7 @@ int css_do_ssch(SubchDev *sch, ORB *orb)
     PMCW *p = &sch->curr_status.pmcw;
     int ret;
 
-    if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) {
+    if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) {
         ret = -ENODEV;
         goto out;
     }
@@ -990,7 +990,7 @@ int css_do_tsch_get_irb(SubchDev *sch, IRB *target_irb, int *irb_len)
     uint16_t stctl;
     IRB irb;
 
-    if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) {
+    if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) {
         return 3;
     }
 
@@ -1196,7 +1196,7 @@ int css_do_rsch(SubchDev *sch)
     PMCW *p = &sch->curr_status.pmcw;
     int ret;
 
-    if (!(p->flags & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA))) {
+    if (~(p->flags) & (PMCW_FLAGS_MASK_DNV | PMCW_FLAGS_MASK_ENA)) {
         ret = -ENODEV;
         goto out;
     }
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Qemu-devel] [PATCH 8/8] s390x/kvm: fix build against qemu_uuid
  2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
                   ` (6 preceding siblings ...)
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 7/8] s390x/css: {c, h, t, r, x}sch: require enable AND device number valid Christian Borntraeger
@ 2016-09-27 11:48 ` Christian Borntraeger
  2016-09-27 12:32   ` Fam Zheng
  7 siblings, 1 reply; 10+ messages in thread
From: Christian Borntraeger @ 2016-09-27 11:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Cornelia Huck, Jens Freimann, Alexander Graf,
	Christian Borntraeger, Fam Zheng

commit 9c5ce8db2e5c ("vl: Switch qemu_uuid to QemuUUID") changed most
users of qemu_uuid but not all. Fix a build error on s390/kvm.

Cc: Fam Zheng <famz@redhat.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 target-s390x/kvm.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
index a95d3da..495905c 100644
--- a/target-s390x/kvm.c
+++ b/target-s390x/kvm.c
@@ -1999,7 +1999,7 @@ static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar)
         strcpy((char *)sysib.ext_names[0], "KVMguest");
     }
     /* Insert UUID */
-    memcpy(sysib.vm[0].uuid, qemu_uuid, sizeof(sysib.vm[0].uuid));
+    memcpy(sysib.vm[0].uuid, &qemu_uuid, sizeof(sysib.vm[0].uuid));
 
     s390_cpu_virt_mem_write(cpu, addr, ar, &sysib, sizeof(sysib));
 }
-- 
2.5.5

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [Qemu-devel] [PATCH 8/8] s390x/kvm: fix build against qemu_uuid
  2016-09-27 11:48 ` [Qemu-devel] [PATCH 8/8] s390x/kvm: fix build against qemu_uuid Christian Borntraeger
@ 2016-09-27 12:32   ` Fam Zheng
  0 siblings, 0 replies; 10+ messages in thread
From: Fam Zheng @ 2016-09-27 12:32 UTC (permalink / raw)
  To: Christian Borntraeger
  Cc: qemu-devel, Cornelia Huck, Jens Freimann, Alexander Graf

On Tue, 09/27 13:48, Christian Borntraeger wrote:
> commit 9c5ce8db2e5c ("vl: Switch qemu_uuid to QemuUUID") changed most
> users of qemu_uuid but not all. Fix a build error on s390/kvm.
> 
> Cc: Fam Zheng <famz@redhat.com>
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  target-s390x/kvm.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
> index a95d3da..495905c 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -1999,7 +1999,7 @@ static void insert_stsi_3_2_2(S390CPU *cpu, __u64 addr, uint8_t ar)
>          strcpy((char *)sysib.ext_names[0], "KVMguest");
>      }
>      /* Insert UUID */
> -    memcpy(sysib.vm[0].uuid, qemu_uuid, sizeof(sysib.vm[0].uuid));
> +    memcpy(sysib.vm[0].uuid, &qemu_uuid, sizeof(sysib.vm[0].uuid));
>  
>      s390_cpu_virt_mem_write(cpu, addr, ar, &sysib, sizeof(sysib));
>  }
> -- 
> 2.5.5
> 

Reviewed-by: Fam Zheng <famz@redhat.com>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-09-27 12:32 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-27 11:48 [Qemu-devel] [PATCH 0/8] next patches for s390x/kvm Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 1/8] s390x/pci: re-arrange variable declarations Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 2/8] s390x/pci: assign msix io region for each pci device Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 3/8] s390x/pci: code cleanup Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 4/8] s390x/kvm: Fix potential deadlock in sigp handling Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 5/8] pc-bios/s390-ccw: enable subchannel for IPL I/O devices Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 6/8] pc-bios/s390-ccw.img: rebuild image Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 7/8] s390x/css: {c, h, t, r, x}sch: require enable AND device number valid Christian Borntraeger
2016-09-27 11:48 ` [Qemu-devel] [PATCH 8/8] s390x/kvm: fix build against qemu_uuid Christian Borntraeger
2016-09-27 12:32   ` Fam Zheng

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.