aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJan Glauber <jang@linux.vnet.ibm.com>2011-01-05 06:47:50 -0500
committerMartin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com>2011-01-05 06:47:28 -0500
commit3d6c76ff32bb9b2ebf6e859855d315eb42e3df50 (patch)
tree3a69d4f3023e75fee0bc55ba38ca7a54a8e4760c /drivers
parent4f325184f2d4c1f2258873b2a333005dc4dfcbc0 (diff)
[S390] qdio: outbound tasklet scan threshold
Introduce a scan treshold for the qdio outbound queues. By setting the threshold the driver can tell qdio after how much used SBALs qdio should schedule the outbound tasklet that scans the queue for finished SBALs. The threshold is specific by the drivers because a Hipersockets device is much faster in utilizing outbound buffers than a ZFCP or OSA device. The default values after how many used SBALs the tasklet should run are: OSA: > 31 SBALs Hipersockets: > 7 SBALs zfcp: > 55 SBALs Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/s390/cio/qdio.h2
-rw-r--r--drivers/s390/cio/qdio_main.c8
-rw-r--r--drivers/s390/cio/qdio_setup.c1
-rw-r--r--drivers/s390/net/qeth_core_main.c2
-rw-r--r--drivers/s390/scsi/zfcp_qdio.c2
5 files changed, 14 insertions, 1 deletions
diff --git a/drivers/s390/cio/qdio.h b/drivers/s390/cio/qdio.h
index 9b6ea3ca3ece..a77aa9109cfd 100644
--- a/drivers/s390/cio/qdio.h
+++ b/drivers/s390/cio/qdio.h
@@ -249,6 +249,8 @@ struct qdio_output_q {
249 int use_enh_siga; 249 int use_enh_siga;
250 /* timer to check for more outbound work */ 250 /* timer to check for more outbound work */
251 struct timer_list timer; 251 struct timer_list timer;
252 /* used SBALs before tasklet schedule */
253 int scan_threshold;
252}; 254};
253 255
254/* 256/*
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index 6621de94f3ad..4c0109900c74 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -1492,7 +1492,13 @@ static int handle_outbound(struct qdio_q *q, unsigned int callflags,
1492 qperf_inc(q, fast_requeue); 1492 qperf_inc(q, fast_requeue);
1493 1493
1494out: 1494out:
1495 tasklet_schedule(&q->tasklet); 1495 /* in case of SIGA errors we must process the error immediately */
1496 if (used >= q->u.out.scan_threshold || rc)
1497 tasklet_schedule(&q->tasklet);
1498 else
1499 /* free the SBALs in case of no further traffic */
1500 if (!timer_pending(&q->u.out.timer))
1501 mod_timer(&q->u.out.timer, jiffies + HZ);
1496 return rc; 1502 return rc;
1497} 1503}
1498 1504
diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c
index a13cf7ec64b2..635f35dc8466 100644
--- a/drivers/s390/cio/qdio_setup.c
+++ b/drivers/s390/cio/qdio_setup.c
@@ -178,6 +178,7 @@ static void setup_queues(struct qdio_irq *irq_ptr,
178 setup_queues_misc(q, irq_ptr, qdio_init->output_handler, i); 178 setup_queues_misc(q, irq_ptr, qdio_init->output_handler, i);
179 179
180 q->is_input_q = 0; 180 q->is_input_q = 0;
181 q->u.out.scan_threshold = qdio_init->scan_threshold;
181 setup_storage_lists(q, irq_ptr, output_sbal_array, i); 182 setup_storage_lists(q, irq_ptr, output_sbal_array, i);
182 output_sbal_array += QDIO_MAX_BUFFERS_PER_Q; 183 output_sbal_array += QDIO_MAX_BUFFERS_PER_Q;
183 184
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index e6b2df0e73f5..f65320babf71 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -3831,6 +3831,8 @@ static int qeth_qdio_establish(struct qeth_card *card)
3831 init_data.int_parm = (unsigned long) card; 3831 init_data.int_parm = (unsigned long) card;
3832 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs; 3832 init_data.input_sbal_addr_array = (void **) in_sbal_ptrs;
3833 init_data.output_sbal_addr_array = (void **) out_sbal_ptrs; 3833 init_data.output_sbal_addr_array = (void **) out_sbal_ptrs;
3834 init_data.scan_threshold =
3835 (card->info.type == QETH_CARD_TYPE_IQD) ? 8 : 32;
3834 3836
3835 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, 3837 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED,
3836 QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) { 3838 QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) {
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c
index a0554beb4179..5ae40ef586a8 100644
--- a/drivers/s390/scsi/zfcp_qdio.c
+++ b/drivers/s390/scsi/zfcp_qdio.c
@@ -292,6 +292,8 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
292 id->int_parm = (unsigned long) qdio; 292 id->int_parm = (unsigned long) qdio;
293 id->input_sbal_addr_array = (void **) (qdio->res_q); 293 id->input_sbal_addr_array = (void **) (qdio->res_q);
294 id->output_sbal_addr_array = (void **) (qdio->req_q); 294 id->output_sbal_addr_array = (void **) (qdio->req_q);
295 id->scan_threshold =
296 QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2;
295} 297}
296 298
297/** 299/**