From nobody Wed Oct 29 06:41:47 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linux.ibm.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1524824961399980.7063909671677; Fri, 27 Apr 2018 03:29:21 -0700 (PDT) Received: from localhost ([::1]:47125 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fC0cu-00073P-Fa for importer@patchew.org; Fri, 27 Apr 2018 06:29:16 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43125) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fC0DT-00069t-PL for qemu-devel@nongnu.org; Fri, 27 Apr 2018 06:03:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fC0DQ-00051p-JF for qemu-devel@nongnu.org; Fri, 27 Apr 2018 06:02:59 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:34740 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fC0DQ-00051l-Di for qemu-devel@nongnu.org; Fri, 27 Apr 2018 06:02:56 -0400 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w3RA0FWH093519 for ; Fri, 27 Apr 2018 06:02:55 -0400 Received: from e33.co.us.ibm.com (e33.co.us.ibm.com [32.97.110.151]) by mx0b-001b2d01.pphosted.com with ESMTP id 2hm0hrtxev-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Fri, 27 Apr 2018 06:02:55 -0400 Received: from localhost by e33.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 27 Apr 2018 04:02:54 -0600 Received: from b03cxnp07029.gho.boulder.ibm.com (9.17.130.16) by e33.co.us.ibm.com (192.168.1.133) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 27 Apr 2018 04:02:53 -0600 Received: from b03ledav006.gho.boulder.ibm.com (b03ledav006.gho.boulder.ibm.com [9.17.130.237]) by b03cxnp07029.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w3RA2pSX10027468; Fri, 27 Apr 2018 03:02:51 -0700 Received: from b03ledav006.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 19273C6037; Fri, 27 Apr 2018 04:02:51 -0600 (MDT) Received: from zyimindembp.cn.ibm.com (unknown [9.115.193.83]) by b03ledav006.gho.boulder.ibm.com (Postfix) with ESMTP id A0833C603E; Fri, 27 Apr 2018 04:02:49 -0600 (MDT) From: Yi Min Zhao To: qemu-devel@nongnu.org Date: Fri, 27 Apr 2018 18:02:44 +0800 X-Mailer: git-send-email 2.15.1 (Apple Git-101) In-Reply-To: <20180427100244.14258-1-zyimin@linux.ibm.com> References: <20180427100244.14258-1-zyimin@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18042710-0008-0000-0000-000009AC59DB X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00008931; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000257; SDB=6.01023957; UDB=6.00522773; IPR=6.00803188; MB=3.00020803; MTD=3.00000008; XFM=3.00000015; UTC=2018-04-27 10:02:53 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18042710-0009-0000-0000-000046FE5BD5 Message-Id: <20180427100244.14258-2-zyimin@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2018-04-27_02:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=3 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1804270098 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.158.5 Subject: [Qemu-devel] [RFC PATCH 1/1] s390x/pci: add common fmb X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: borntraeger@de.ibm.com, pasic@linux.vnet.ibm.com, pmorel@linux.vnet.ibm.com, zyimin@linux.ibm.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Common function measurement block is used to report counters of successfully issued pcilg/stg/stb and rpcit instructions. This patch introduces a new struct ZpciFmb and schedules a timer callback to copy fmb to the guest memory at a interval time which is set to 4000ms by default. While attemping to update fmb failed, an event error would be generated. After pcilg/stg/stb and rpcit interception handlers issue successfully, increase the related counter. Signed-off-by: Yi Min Zhao --- hw/s390x/s390-pci-bus.c | 3 ++- hw/s390x/s390-pci-bus.h | 16 +++++++++++++ hw/s390x/s390-pci-inst.c | 60 ++++++++++++++++++++++++++++++++++++++++++++= +++- hw/s390x/s390-pci-inst.h | 1 + 4 files changed, 78 insertions(+), 2 deletions(-) diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index 10da87458e..62e121dcf6 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -967,6 +967,7 @@ static void s390_pcihost_hot_unplug(HotplugHandler *hot= plug_dev, bus =3D pci_get_bus(pci_dev); devfn =3D pci_dev->devfn; object_unparent(OBJECT(pci_dev)); + s390_pci_fmb_free(pbdev); s390_pci_msix_free(pbdev); s390_pci_iommu_free(s, bus, devfn); pbdev->pdev =3D NULL; @@ -1139,7 +1140,7 @@ static void s390_pci_device_reset(DeviceState *dev) pci_dereg_ioat(pbdev->iommu); } =20 - pbdev->fmb_addr =3D 0; + s390_pci_fmb_free(pbdev); } =20 static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name, diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h index 1f7f9b5814..c280dfaacc 100644 --- a/hw/s390x/s390-pci-bus.h +++ b/hw/s390x/s390-pci-bus.h @@ -286,6 +286,20 @@ typedef struct S390PCIIOMMUTable { S390PCIIOMMU *iommu[PCI_SLOT_MAX]; } S390PCIIOMMUTable; =20 +/* Function Measurement Block */ +#define DEFAULT_MUI 4000 +#define UPDATE_TIME_MASK (~0x1ULL) +typedef struct ZpciFmb { + uint32_t format : 8; + uint32_t fmt_ind : 24; + uint32_t sample; + uint64_t last_update; + uint64_t ld_ops; + uint64_t st_ops; + uint64_t stb_ops; + uint64_t rpcit_ops; +} QEMU_PACKED ZpciFmb; + struct S390PCIBusDevice { DeviceState qdev; PCIDevice *pdev; @@ -297,6 +311,8 @@ struct S390PCIBusDevice { uint32_t fid; bool fid_defined; uint64_t fmb_addr; + ZpciFmb fmb; + QEMUTimer *fmb_timer; uint8_t isc; uint16_t noi; uint16_t maxstbl; diff --git a/hw/s390x/s390-pci-inst.c b/hw/s390x/s390-pci-inst.c index 3fcc330fe3..3b64ed0960 100644 --- a/hw/s390x/s390-pci-inst.c +++ b/hw/s390x/s390-pci-inst.c @@ -14,6 +14,7 @@ #include "qemu/osdep.h" #include "qemu-common.h" #include "cpu.h" +#include "internal.h" #include "s390-pci-inst.h" #include "s390-pci-bus.h" #include "exec/memory-internal.h" @@ -295,7 +296,7 @@ int clp_service_call(S390CPU *cpu, uint8_t r2, uintptr_= t ra) resgrp->fr =3D 1; stq_p(&resgrp->dasm, 0); stq_p(&resgrp->msia, ZPCI_MSI_ADDR); - stw_p(&resgrp->mui, 0); + stw_p(&resgrp->mui, DEFAULT_MUI); stw_p(&resgrp->i, 128); stw_p(&resgrp->maxstbl, 128); resgrp->version =3D 0; @@ -460,6 +461,10 @@ int pcilg_service_call(S390CPU *cpu, uint8_t r1, uint8= _t r2, uintptr_t ra) return 0; } =20 + if (pbdev->fmb_addr) { + pbdev->fmb.ld_ops++; + } + env->regs[r1] =3D data; setcc(cpu, ZPCI_PCI_LS_OK); return 0; @@ -567,6 +572,10 @@ int pcistg_service_call(S390CPU *cpu, uint8_t r1, uint= 8_t r2, uintptr_t ra) return 0; } =20 + if (pbdev->fmb_addr) { + pbdev->fmb.st_ops++; + } + setcc(cpu, ZPCI_PCI_LS_OK); return 0; } @@ -689,6 +698,9 @@ err: s390_set_status_code(env, r1, ZPCI_PCI_ST_FUNC_IN_ERR); s390_pci_generate_error_event(error, pbdev->fh, pbdev->fid, start,= 0); } else { + if (pbdev->fmb_addr) { + pbdev->fmb.rpcit_ops++; + } setcc(cpu, ZPCI_PCI_LS_OK); } return 0; @@ -740,6 +752,8 @@ int pcistb_service_call(S390CPU *cpu, uint8_t r1, uint8= _t r3, uint64_t gaddr, break; } =20 + atomic_inc(&pbdev->fmb.stb_ops); + if (pcias > ZPCI_IO_BAR_MAX) { DPRINTF("pcistb invalid space\n"); setcc(cpu, ZPCI_PCI_LS_ERR); @@ -896,6 +910,42 @@ void pci_dereg_ioat(S390PCIIOMMU *iommu) iommu->g_iota =3D 0; } =20 +void s390_pci_fmb_free(S390PCIBusDevice *pbdev) +{ + if (!pbdev) { + return; + } + + if (pbdev->fmb_timer) { + timer_del(pbdev->fmb_timer); + timer_free(pbdev->fmb_timer); + pbdev->fmb_timer =3D NULL; + } + pbdev->fmb_addr =3D 0; + memset(&pbdev->fmb, 0, sizeof(ZpciFmb)); +} + +static void fmb_update(void *opaque) +{ + S390PCIBusDevice *pbdev =3D opaque; + MemTxResult ret; + + pbdev->fmb.sample++; + pbdev->fmb.last_update =3D time2tod(qemu_clock_get_ns(QEMU_CLOCK_VIRTU= AL)) + & UPDATE_TIME_MASK; + ret =3D address_space_write(&address_space_memory, pbdev->fmb_addr, + MEMTXATTRS_UNSPECIFIED, (uint8_t *)&pbdev->f= mb, + sizeof(ZpciFmb)); + if (ret) { + s390_pci_generate_error_event(ERR_EVENT_FMBA, pbdev->fh, pbdev->fi= d, + pbdev->fmb_addr, 0); + s390_pci_fmb_free(pbdev); + } else { + timer_mod(pbdev->fmb_timer, + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + DEFAULT_MUI); + } +} + int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t a= r, uintptr_t ra) { @@ -1027,6 +1077,14 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, ui= nt64_t fiba, uint8_t ar, break; case ZPCI_MOD_FC_SET_MEASURE: pbdev->fmb_addr =3D ldq_p(&fib.fmb_addr); + if (!pbdev->fmb_addr) { + s390_pci_fmb_free(pbdev); + } else { + pbdev->fmb_timer =3D timer_new_ms(QEMU_CLOCK_VIRTUAL, + fmb_update, pbdev); + timer_mod(pbdev->fmb_timer, + qemu_clock_get_ms(QEMU_CLOCK_VIRTUAL) + DEFAULT_MUI); + } break; default: s390_program_interrupt(&cpu->env, PGM_OPERAND, 6, ra); diff --git a/hw/s390x/s390-pci-inst.h b/hw/s390x/s390-pci-inst.h index 91c3d61f2a..579fc55255 100644 --- a/hw/s390x/s390-pci-inst.h +++ b/hw/s390x/s390-pci-inst.h @@ -303,6 +303,7 @@ int mpcifc_service_call(S390CPU *cpu, uint8_t r1, uint6= 4_t fiba, uint8_t ar, uintptr_t ra); int stpcifc_service_call(S390CPU *cpu, uint8_t r1, uint64_t fiba, uint8_t = ar, uintptr_t ra); +void s390_pci_fmb_free(S390PCIBusDevice *pbdev); =20 #define ZPCI_IO_BAR_MIN 0 #define ZPCI_IO_BAR_MAX 5 --=20 2.15.1 (Apple Git-101)