Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Sebastian Ott and committed by
Martin Schwidefsky
852eb1aa d445a4e2

+21 -28
+21 -28
drivers/s390/scsi/zfcp_qdio.c
··· 14 14 #include "zfcp_ext.h" 15 15 #include "zfcp_qdio.h" 16 16 17 - #define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer)) 18 - 19 17 static bool enable_multibuffer = 1; 20 18 module_param_named(datarouter, enable_multibuffer, bool, 0400); 21 19 MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)"); 22 - 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 20 38 21 static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id, 39 22 unsigned int qdio_err) ··· 309 326 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) 310 327 { 311 328 struct qdio_initialize init_data; 329 + int ret; 312 330 313 - if (zfcp_qdio_buffers_enqueue(qdio->req_q) || 314 - zfcp_qdio_buffers_enqueue(qdio->res_q)) 331 + ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); 332 + if (ret) 315 333 return -ENOMEM; 334 + 335 + ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); 336 + if (ret) 337 + goto free_req_q; 316 338 317 339 zfcp_qdio_setup_init_data(&init_data, qdio); 318 340 init_waitqueue_head(&qdio->req_q_wq); 319 341 320 - return qdio_allocate(&init_data); 342 + ret = qdio_allocate(&init_data); 343 + if (ret) 344 + goto free_res_q; 345 + 346 + return 0; 347 + 348 + free_res_q: 349 + qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); 350 + free_req_q: 351 + qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); 352 + return ret; 321 353 } 322 354 323 355 /** ··· 446 448 447 449 void zfcp_qdio_destroy(struct zfcp_qdio *qdio) 448 450 { 449 - int p; 450 - 451 451 if (!qdio) 452 452 return; 453 453 454 454 if (qdio->adapter->ccw_device) 455 455 qdio_free(qdio->adapter->ccw_device); 456 456 457 - for (p = 0; p < QDIO_MAX_BUFFERS_PER_Q; p += QBUFF_PER_PAGE) { 458 - free_page((unsigned long) qdio->req_q[p]); 459 - free_page((unsigned long) qdio->res_q[p]); 460 - } 461 - 457 + qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); 458 + qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q); 462 459 kfree(qdio); 463 460 } 464 461 ··· 468 475 qdio->adapter = adapter; 469 476 470 477 if (zfcp_qdio_allocate(qdio)) { 471 - zfcp_qdio_destroy(qdio); 478 + kfree(qdio); 472 479 return -ENOMEM; 473 480 } 474 481