]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
[S390] qdio: optimize cache line usage of struct qdio_irq
authorJan Glauber <jang@linux.vnet.ibm.com>
Fri, 26 Feb 2010 21:37:37 +0000 (22:37 +0100)
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>
Fri, 26 Feb 2010 21:37:31 +0000 (22:37 +0100)
Remove a memset hack that relied on the internal layout of the
qdio_irq struct and move the per device statistics data into an own
cache line to avoid cache line bashing between the inbound and the
outbound queue tasklets. Also reduce the number of allocated queues
from 32 to 4 which is the current maximum. That saves a cache line
in struct qdio_irq.

Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/qdio.h
drivers/s390/cio/qdio.h
drivers/s390/cio/qdio_setup.c

index 79d849f014f06223945646145c362547dce6057d..c666bfe5e9847dc055ad7bcc5f7c863afa89f4cb 100644 (file)
@@ -13,7 +13,8 @@
 #include <asm/cio.h>
 #include <asm/ccwdev.h>
 
-#define QDIO_MAX_QUEUES_PER_IRQ                32
+/* only use 4 queues to save some cachelines */
+#define QDIO_MAX_QUEUES_PER_IRQ                4
 #define QDIO_MAX_BUFFERS_PER_Q         128
 #define QDIO_MAX_BUFFERS_MASK          (QDIO_MAX_BUFFERS_PER_Q - 1)
 #define QDIO_MAX_ELEMENTS_PER_BUFFER   16
index 9a5283e16e38ef9a33231f5b60e17d0e956dcc4a..48aa0647432bb258d5ce97aa8db72a497cc2a52e 100644 (file)
@@ -208,7 +208,7 @@ struct qdio_dev_perf_stat {
        unsigned int eqbs_partial;
        unsigned int sqbs;
        unsigned int sqbs_partial;
-};
+} ____cacheline_aligned;
 
 struct qdio_queue_perf_stat {
        /*
@@ -329,12 +329,8 @@ struct qdio_irq {
        struct qdio_ssqd_desc ssqd_desc;
        void (*orig_handler) (struct ccw_device *, unsigned long, struct irb *);
 
-       struct qdio_dev_perf_stat perf_stat;
        int perf_stat_enabled;
-       /*
-        * Warning: Leave these members together at the end so they won't be
-        * cleared in qdio_setup_irq.
-        */
+
        struct qdr *qdr;
        unsigned long chsc_page;
 
@@ -343,6 +339,7 @@ struct qdio_irq {
 
        debug_info_t *debug_area;
        struct mutex setup_mutex;
+       struct qdio_dev_perf_stat perf_stat;
 };
 
 /* helper functions */
index 4464907715a4e46e5b48d948318272b3cf15a9bd..7f4a75465140d768dff0f5729ceeaedfffddffb2 100644 (file)
@@ -382,7 +382,15 @@ int qdio_setup_irq(struct qdio_initialize *init_data)
        struct qdio_irq *irq_ptr = init_data->cdev->private->qdio_data;
        int rc;
 
-       memset(irq_ptr, 0, ((char *)&irq_ptr->qdr) - ((char *)irq_ptr));
+       memset(&irq_ptr->qib, 0, sizeof(irq_ptr->qib));
+       memset(&irq_ptr->siga_flag, 0, sizeof(irq_ptr->siga_flag));
+       memset(&irq_ptr->ccw, 0, sizeof(irq_ptr->ccw));
+       memset(&irq_ptr->ssqd_desc, 0, sizeof(irq_ptr->ssqd_desc));
+       memset(&irq_ptr->perf_stat, 0, sizeof(irq_ptr->perf_stat));
+
+       irq_ptr->debugfs_dev = irq_ptr->debugfs_perf = NULL;
+       irq_ptr->sch_token = irq_ptr->state = irq_ptr->perf_stat_enabled = 0;
+
        /* wipes qib.ac, required by ar7063 */
        memset(irq_ptr->qdr, 0, sizeof(struct qdr));