Commit 852eb1aa authored by Sebastian Ott's avatar Sebastian Ott Committed by Martin Schwidefsky

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: default avatarSteffen Maier <maier@linux.vnet.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent d445a4e2
...@@ -14,27 +14,10 @@ ...@@ -14,27 +14,10 @@
#include "zfcp_ext.h" #include "zfcp_ext.h"
#include "zfcp_qdio.h" #include "zfcp_qdio.h"
#define QBUFF_PER_PAGE (PAGE_SIZE / sizeof(struct qdio_buffer))
static bool enable_multibuffer = 1; static bool enable_multibuffer = 1;
module_param_named(datarouter, enable_multibuffer, bool, 0400); module_param_named(datarouter, enable_multibuffer, bool, 0400);
MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)"); MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)");
static int zfcp_qdio_buffers_enqueue(struct qdio_buffer **sbal)
{
int pos;
for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos += QBUFF_PER_PAGE) {
sbal[pos] = (struct qdio_buffer *) get_zeroed_page(GFP_KERNEL);
if (!sbal[pos])
return -ENOMEM;
}
for (pos = 0; pos < QDIO_MAX_BUFFERS_PER_Q; pos++)
if (pos % QBUFF_PER_PAGE)
sbal[pos] = sbal[pos - 1] + 1;
return 0;
}
static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id, static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,
unsigned int qdio_err) unsigned int qdio_err)
{ {
...@@ -326,15 +309,30 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id, ...@@ -326,15 +309,30 @@ static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
{ {
struct qdio_initialize init_data; struct qdio_initialize init_data;
int ret;
if (zfcp_qdio_buffers_enqueue(qdio->req_q) || ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
zfcp_qdio_buffers_enqueue(qdio->res_q)) if (ret)
return -ENOMEM; return -ENOMEM;
ret = qdio_alloc_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
if (ret)
goto free_req_q;
zfcp_qdio_setup_init_data(&init_data, qdio); zfcp_qdio_setup_init_data(&init_data, qdio);
init_waitqueue_head(&qdio->req_q_wq); init_waitqueue_head(&qdio->req_q_wq);
return qdio_allocate(&init_data); ret = qdio_allocate(&init_data);
if (ret)
goto free_res_q;
return 0;
free_res_q:
qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
free_req_q:
qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
return ret;
} }
/** /**
...@@ -448,19 +446,14 @@ int zfcp_qdio_open(struct zfcp_qdio *qdio) ...@@ -448,19 +446,14 @@ int zfcp_qdio_open(struct zfcp_qdio *qdio)
void zfcp_qdio_destroy(struct zfcp_qdio *qdio) void zfcp_qdio_destroy(struct zfcp_qdio *qdio)
{ {
int p;
if (!qdio) if (!qdio)
return; return;
if (qdio->adapter->ccw_device) if (qdio->adapter->ccw_device)
qdio_free(qdio->adapter->ccw_device); qdio_free(qdio->adapter->ccw_device);
for (p = 0; p < QDIO_MAX_BUFFERS_PER_Q; p += QBUFF_PER_PAGE) { qdio_free_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
free_page((unsigned long) qdio->req_q[p]); qdio_free_buffers(qdio->res_q, QDIO_MAX_BUFFERS_PER_Q);
free_page((unsigned long) qdio->res_q[p]);
}
kfree(qdio); kfree(qdio);
} }
...@@ -475,7 +468,7 @@ int zfcp_qdio_setup(struct zfcp_adapter *adapter) ...@@ -475,7 +468,7 @@ int zfcp_qdio_setup(struct zfcp_adapter *adapter)
qdio->adapter = adapter; qdio->adapter = adapter;
if (zfcp_qdio_allocate(qdio)) { if (zfcp_qdio_allocate(qdio)) {
zfcp_qdio_destroy(qdio); kfree(qdio);
return -ENOMEM; return -ENOMEM;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment