qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [qemu-s390x] [PATCH] s390x/pci: add common fmb


From: Yi Min Zhao
Subject: Re: [Qemu-devel] [qemu-s390x] [PATCH] s390x/pci: add common fmb
Date: Tue, 16 Oct 2018 15:19:58 +0800
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1



在 2018/10/1 下午5:22, Thomas Huth 写道:
On 2018-09-29 07:48, Yi Min Zhao wrote:
在 2018/9/19 下午3:53, Thomas Huth 写道:
On 2018-09-19 09:08, Yi Min Zhao wrote:
[...]
diff --git a/hw/s390x/s390-pci-bus.h b/hw/s390x/s390-pci-bus.h
index 1f7f9b5814..fdf13a19c0 100644
--- a/hw/s390x/s390-pci-bus.h
+++ b/hw/s390x/s390-pci-bus.h
@@ -286,6 +286,28 @@ typedef struct S390PCIIOMMUTable {
        S390PCIIOMMU *iommu[PCI_SLOT_MAX];
    } S390PCIIOMMUTable;
    +/* Function Measurement Block */
+#define DEFAULT_MUI 4000
+#define UPDATE_U_BIT 0x1ULL
+#define FMBK_MASK 0xfULL
+
+typedef struct ZpciFmbFmt0 {
+    uint64_t dma_rbytes;
+    uint64_t dma_wbytes;
+} ZpciFmbFmt0;
+
+typedef struct ZpciFmb {
+    uint8_t format;
+    uint8_t fmt_ind[3];
+    uint32_t sample;
+    uint64_t last_update;
+    uint64_t ld_ops;
+    uint64_t st_ops;
+    uint64_t stb_ops;
+    uint64_t rpcit_ops;
+    ZpciFmbFmt0 fmt0;
+} QEMU_PACKED __attribute((__aligned__(8))) ZpciFmb;
All the fields in this struct are naturally aligned already, so I'd
maybe rather drop the QEMU_PACKED and add a
QEMU_BUILD_BUG_MSG(sizeof(ZpciFmb) != xx, ...) statement afterwards.
Currently we only implement FMT0. There're other FMTs to be implemented
in future.
So here there would be a union and we can't give a specific size to
QEMU_BUILD_BUG_MSG.
Can we use the max size for checking?
I think you could use this to check the beginning of the struct:
At the beginning of the struct? not after it?

QEMU_BUILD_BUG_MSG(offsetof(ZpciFmb, fmt0) != 48, "padding in ZpciFmb");
I think this could satisfy our requirement.

    struct S390PCIBusDevice {
        DeviceState qdev;
        PCIDevice *pdev;
@@ -297,6 +319,8 @@ struct S390PCIBusDevice {
        uint32_t fid;
        bool fid_defined;
        uint64_t fmb_addr;
+    ZpciFmb fmb;
... since you embed it here in another struct which does not have any
alignment requirements. This is likely going to cause an error with GCC
8.1, we've had this problem in the past already:

https://git.qemu.org/?p=qemu.git;a=commitdiff;h=a6e4385dea94850d7b06b0
Ah...I didn't test the code with gcc 8+. GCC I used is 7.2.
It should get the same warining.
Nobody reported the warning in the s390-ccw bios until GCC 8 had been
released, so I assume this is a new warning in GCC 8.

Is the __align__(8) required at all? As far as I understand the code,
the struct is not living inside the guest memory, is it? So you could
simply drop the __align__(8).
But if you need it, I think you have to allocate the memory for ZpciFmb
separately (and use a "ZpciFmb *fmb" here instead).
I want to copy the entire structure to the guest memory during updating
FMB.
It's not a good idea to do copy for all members multiple times.
Sure, but you're doing the updates through address_space_write(), so as
far as I can see there is currently no need for the
attribute((__aligned__(8))) here (or did I miss something?). Thus I'd
like to suggest to simply remove that attribute here.

  Thomas


Agree to remove it.

--
Yi Min




reply via email to

[Prev in Thread] Current Thread [Next in Thread]