diff options
| author | Sebastian Ott <sebott@linux.vnet.ibm.com> | 2014-06-27 11:11:38 -0400 |
|---|---|---|
| committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2014-07-22 03:26:16 -0400 |
| commit | 852eb1aa2bd342dede0126f50d4fde7d963db32e (patch) | |
| tree | 878c9e623d2bb078b1232ab071479c6e72a7a27a /drivers | |
| parent | d445a4e28c0ff740e946ae22860be85428814c39 (diff) | |
s390/zfcp: use qdio buffer helpers
Use qdio buffer helpers to manage the buffers used for the request
and response queues.
No functional change.
Reviewed-by: Steffen Maier <maier@linux.vnet.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 06025cdaa4ad..495e1cb3afa6 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
| @@ -14,27 +14,10 @@ | |||
| 14 | #include "zfcp_ext.h" | 14 | #include "zfcp_ext.h" |
| 15 | #include "zfcp_qdio.h" | 15 | #include "zfcp_qdio.h" |
| 16 | 16 | ||
| 17 | #define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer)) | ||
| 18 | |||
| 19 | static bool enable_multibuffer = 1; | 17 | static bool enable_multibuffer = 1; |
| 20 | module_param_named(datarouter, enable_multibuffer, bool, 0400); | 18 | module_param_named(datarouter, enable_multibuffer, bool, 0400); |
| 21 | MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)"); | 19 | MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)"); |
| 22 | 20 | ||
| 23 | static int zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbal) | ||
| 24 | { | ||
| 25 | int pos; | ||
| 26 | |||
| 27 | for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) { | ||
| 28 | sbal[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL); | ||
| 29 | if (!sbal[pos]) | ||
| 30 | return -ENOMEM; | ||
| 31 | } | ||
| 32 | for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++) | ||
| 33 | if (pos % QBUFF_PER_PAGE) | ||
| 34 | sbal[pos] = sbal[pos - 1] + 1; | ||
| 35 | return 0; | ||
| 36 | } | ||
| 37 | |||
| 38 | static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id, | 21 | static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id, |
| 39 | unsigned int qdio_err) | 22 | unsigned int qdio_err) |
| 40 | { | 23 | { |
| @@ -326,15 +309,30 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id, | |||
| 326 | static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) | 309 | static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) |
| 327 | { | 310 | { |
| 328 | struct qdio_initialize init_data; | 311 | struct qdio_initialize init_data; |
| 312 | int ret; | ||
| 329 | 313 | ||
| 330 | if (zfcp_qdio_buffers_enqueue(qdio->req_q) || | 314 | ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); |
| 331 | zfcp_qdio_buffers_enqueue(qdio->res_q)) | 315 | if (ret) |
| 332 | return -ENOMEM; | 316 | return -ENOMEM; |
| 333 | 317 | ||
| 318 | ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); | ||
| 319 | if (ret) | ||
| 320 | goto free_req_q; | ||
| 321 | |||
| 334 | zfcp_qdio_setup_init_data(&init_data, qdio); | 322 | zfcp_qdio_setup_init_data(&init_data, qdio); |
| 335 | init_waitqueue_head(&qdio->req_q_wq); | 323 | init_waitqueue_head(&qdio->req_q_wq); |
| 336 | 324 | ||
| 337 | return qdio_allocate(&init_data); | 325 | ret = qdio_allocate(&init_data); |
| 326 | if (ret) | ||
| 327 | goto free_res_q; | ||
| 328 | |||
| 329 | return 0; | ||
| 330 | |||
| 331 | free_res_q: | ||
| 332 | qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); | ||
| 333 | free_req_q: | ||
| 334 | qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); | ||
| 335 | return ret; | ||
| 338 | } | 336 | } |
| 339 | 337 | ||
| 340 | /** | 338 | /** |
| @@ -448,19 +446,14 @@ failed_establish: | |||
| 448 | 446 | ||
| 449 | void zfcp_qdio_destroy(struct zfcp_qdio *qdio) | 447 | void zfcp_qdio_destroy(struct zfcp_qdio *qdio) |
| 450 | { | 448 | { |
| 451 | int p; | ||
| 452 | |||
| 453 | if (!qdio) | 449 | if (!qdio) |
| 454 | return; | 450 | return; |
| 455 | 451 | ||
| 456 | if (qdio->adapter->ccw_device) | 452 | if (qdio->adapter->ccw_device) |
| 457 | qdio_free(qdio->adapter->ccw_device); | 453 | qdio_free(qdio->adapter->ccw_device); |
| 458 | 454 | ||
| 459 | for (p = 0; p < QDIO_MAX_BUFFERS_PER_Q; p += QBUFF_PER_PAGE) { | 455 | qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); |
| 460 | free_page((unsigned long) qdio->req_q[p]); | 456 | qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); |
| 461 | free_page((unsigned long) qdio->res_q[p]); | ||
| 462 | } | ||
| 463 | |||
| 464 | kfree(qdio); | 457 | kfree(qdio); |
| 465 | } | 458 | } |
| 466 | 459 | ||
| @@ -475,7 +468,7 @@ int zfcp_qdio_setup(struct zfcp_adapter *adapter) | |||
| 475 | qdio->adapter = adapter; | 468 | qdio->adapter = adapter; |
| 476 | 469 | ||
| 477 | if (zfcp_qdio_allocate(qdio)) { | 470 | if (zfcp_qdio_allocate(qdio)) { |
| 478 | zfcp_qdio_destroy(qdio); | 471 | kfree(qdio); |
| 479 | return -ENOMEM; | 472 | return -ENOMEM; |
| 480 | } | 473 | } |
| 481 | 474 | ||
