s390/pci: extract software counters from fmb
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Fri, 10 Apr 2015 12:33:08 +0000 (14:33 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 15 Apr 2015 10:23:52 +0000 (12:23 +0200)
The software counters are not a part of the function measurement
block. Also we do not check for zdev->fmb != NULL when using these
counters (function measurement can be toggled at runtime). Just move
the software counters to struct zpci_dev.

Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/pci.h
arch/s390/pci/pci.c
arch/s390/pci/pci_debug.c
arch/s390/pci/pci_dma.c

index ef803c202d42d5631c8a074e69148799096a4151..d318e38dcb83d5086c1b2fc07dc5ab21908cb866 100644 (file)
@@ -44,10 +44,6 @@ struct zpci_fmb {
        u64 rpcit_ops;
        u64 dma_rbytes;
        u64 dma_wbytes;
-       /* software counters */
-       atomic64_t allocated_pages;
-       atomic64_t mapped_pages;
-       atomic64_t unmapped_pages;
 } __packed __aligned(16);
 
 enum zpci_state {
@@ -111,6 +107,10 @@ struct zpci_dev {
        /* Function measurement block */
        struct zpci_fmb *fmb;
        u16             fmb_update;     /* update interval */
+       /* software counters */
+       atomic64_t allocated_pages;
+       atomic64_t mapped_pages;
+       atomic64_t unmapped_pages;
 
        enum pci_bus_speed max_bus_speed;
 
index 98336200c7b24241a99bd48fc75237dd418a4ffa..281893864e1b454ee76618b6fbc9ac98ff68afa4 100644 (file)
@@ -190,6 +190,11 @@ int zpci_fmb_enable_device(struct zpci_dev *zdev)
                return -ENOMEM;
        WARN_ON((u64) zdev->fmb & 0xf);
 
+       /* reset software counters */
+       atomic64_set(&zdev->allocated_pages, 0);
+       atomic64_set(&zdev->mapped_pages, 0);
+       atomic64_set(&zdev->unmapped_pages, 0);
+
        args.fmb_addr = virt_to_phys(zdev->fmb);
        return mod_pci(zdev, ZPCI_MOD_FC_SET_MEASURE, 0, &args);
 }
index 3229a2e570df2215801c49c9c3e734cd72c503b6..97db1a411d54bb0d27f5c60244fd5114f4f95683 100644 (file)
@@ -31,12 +31,25 @@ static char *pci_perf_names[] = {
        "Refresh operations",
        "DMA read bytes",
        "DMA write bytes",
-       /* software counters */
+};
+
+static char *pci_sw_names[] = {
        "Allocated pages",
        "Mapped pages",
        "Unmapped pages",
 };
 
+static void pci_sw_counter_show(struct seq_file *m)
+{
+       struct zpci_dev *zdev = m->private;
+       atomic64_t *counter = &zdev->allocated_pages;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(pci_sw_names); i++, counter++)
+               seq_printf(m, "%26s:\t%llu\n", pci_sw_names[i],
+                          atomic64_read(counter));
+}
+
 static int pci_perf_show(struct seq_file *m, void *v)
 {
        struct zpci_dev *zdev = m->private;
@@ -63,12 +76,8 @@ static int pci_perf_show(struct seq_file *m, void *v)
                for (i = 4; i < 6; i++)
                        seq_printf(m, "%26s:\t%llu\n",
                                   pci_perf_names[i], *(stat + i));
-       /* software counters */
-       for (i = 6; i < ARRAY_SIZE(pci_perf_names); i++)
-               seq_printf(m, "%26s:\t%llu\n",
-                          pci_perf_names[i],
-                          atomic64_read((atomic64_t *) (stat + i)));
 
+       pci_sw_counter_show(m);
        return 0;
 }
 
index 4cbb29a4d6152238c771d5f1936b9d9d15b94e68..6fd8d583613807904eac33ab9ce5030709545f73 100644 (file)
@@ -300,7 +300,7 @@ static dma_addr_t s390_dma_map_pages(struct device *dev, struct page *page,
                flags |= ZPCI_TABLE_PROTECTED;
 
        if (!dma_update_trans(zdev, pa, dma_addr, size, flags)) {
-               atomic64_add(nr_pages, &zdev->fmb->mapped_pages);
+               atomic64_add(nr_pages, &zdev->mapped_pages);
                return dma_addr + (offset & ~PAGE_MASK);
        }
 
@@ -328,7 +328,7 @@ static void s390_dma_unmap_pages(struct device *dev, dma_addr_t dma_addr,
                zpci_err_hex(&dma_addr, sizeof(dma_addr));
        }
 
-       atomic64_add(npages, &zdev->fmb->unmapped_pages);
+       atomic64_add(npages, &zdev->unmapped_pages);
        iommu_page_index = (dma_addr - zdev->start_dma) >> PAGE_SHIFT;
        dma_free_iommu(zdev, iommu_page_index, npages);
 }
@@ -357,7 +357,7 @@ static void *s390_dma_alloc(struct device *dev, size_t size,
                return NULL;
        }
 
-       atomic64_add(size / PAGE_SIZE, &zdev->fmb->allocated_pages);
+       atomic64_add(size / PAGE_SIZE, &zdev->allocated_pages);
        if (dma_handle)
                *dma_handle = map;
        return (void *) pa;
@@ -370,7 +370,7 @@ static void s390_dma_free(struct device *dev, size_t size,
        struct zpci_dev *zdev = get_zdev(to_pci_dev(dev));
 
        size = PAGE_ALIGN(size);
-       atomic64_sub(size / PAGE_SIZE, &zdev->fmb->allocated_pages);
+       atomic64_sub(size / PAGE_SIZE, &zdev->allocated_pages);
        s390_dma_unmap_pages(dev, dma_handle, size, DMA_BIDIRECTIONAL, NULL);
        free_pages((unsigned long) pa, get_order(size));
 }