Commit 6b9e1520 authored by Christof Schmitt's avatar Christof Schmitt Committed by James Bottomley

[SCSI] zfcp: Move sbal_get function to zfcp_qdio.c

Waiting for a free sbal is a operation on the qdio queue. Move the
code implementing the wait to zfcp_qdio.c and rename the functions
accordingly.
Reviewed-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 1674b405
...@@ -143,6 +143,7 @@ extern void zfcp_fsf_reqid_check(struct zfcp_qdio *, int); ...@@ -143,6 +143,7 @@ extern void zfcp_fsf_reqid_check(struct zfcp_qdio *, int);
/* zfcp_qdio.c */ /* zfcp_qdio.c */
extern int zfcp_qdio_setup(struct zfcp_adapter *); extern int zfcp_qdio_setup(struct zfcp_adapter *);
extern void zfcp_qdio_destroy(struct zfcp_qdio *); extern void zfcp_qdio_destroy(struct zfcp_qdio *);
extern int zfcp_qdio_sbal_get(struct zfcp_qdio *);
extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_qdio_req *); extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_qdio_req *);
extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, struct zfcp_qdio_req *, extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, struct zfcp_qdio_req *,
struct scatterlist *, int); struct scatterlist *, int);
......
...@@ -640,37 +640,6 @@ static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req) ...@@ -640,37 +640,6 @@ static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)
} }
} }
static int zfcp_fsf_sbal_check(struct zfcp_qdio *qdio)
{
struct zfcp_qdio_queue *req_q = &qdio->req_q;
spin_lock_bh(&qdio->req_q_lock);
if (atomic_read(&req_q->count))
return 1;
spin_unlock_bh(&qdio->req_q_lock);
return 0;
}
static int zfcp_fsf_req_sbal_get(struct zfcp_qdio *qdio)
{
struct zfcp_adapter *adapter = qdio->adapter;
long ret;
spin_unlock_bh(&qdio->req_q_lock);
ret = wait_event_interruptible_timeout(qdio->req_q_wq,
zfcp_fsf_sbal_check(qdio), 5 * HZ);
if (ret > 0)
return 0;
if (!ret) {
atomic_inc(&qdio->req_q_full);
/* assume hanging outbound queue, try queue recovery */
zfcp_erp_adapter_reopen(adapter, 0, "fsrsg_1", NULL);
}
spin_lock_bh(&qdio->req_q_lock);
return -EIO;
}
static struct zfcp_fsf_req *zfcp_fsf_alloc(mempool_t *pool) static struct zfcp_fsf_req *zfcp_fsf_alloc(mempool_t *pool)
{ {
struct zfcp_fsf_req *req; struct zfcp_fsf_req *req;
...@@ -798,7 +767,7 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio) ...@@ -798,7 +767,7 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_UNSOLICITED_STATUS, 0, req = zfcp_fsf_req_create(qdio, FSF_QTCB_UNSOLICITED_STATUS, 0,
...@@ -898,7 +867,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id, ...@@ -898,7 +867,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id,
struct zfcp_qdio *qdio = unit->port->adapter->qdio; struct zfcp_qdio *qdio = unit->port->adapter->qdio;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND, req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND,
SBAL_FLAGS0_TYPE_READ, SBAL_FLAGS0_TYPE_READ,
...@@ -1068,7 +1037,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, ...@@ -1068,7 +1037,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
int ret = -EIO; int ret = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC, req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC,
...@@ -1165,7 +1134,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, ...@@ -1165,7 +1134,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
int ret = -EIO; int ret = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS, req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS,
...@@ -1208,7 +1177,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) ...@@ -1208,7 +1177,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA, req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
...@@ -1250,7 +1219,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio, ...@@ -1250,7 +1219,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio,
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out_unlock; goto out_unlock;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA, req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
...@@ -1302,7 +1271,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) ...@@ -1302,7 +1271,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
return -EOPNOTSUPP; return -EOPNOTSUPP;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA, req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
...@@ -1348,7 +1317,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, ...@@ -1348,7 +1317,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio,
return -EOPNOTSUPP; return -EOPNOTSUPP;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out_unlock; goto out_unlock;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA, req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
...@@ -1462,7 +1431,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) ...@@ -1462,7 +1431,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID, req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
...@@ -1530,7 +1499,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) ...@@ -1530,7 +1499,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT, req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
...@@ -1605,7 +1574,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) ...@@ -1605,7 +1574,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID, req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
...@@ -1658,7 +1627,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) ...@@ -1658,7 +1627,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT, req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
...@@ -1750,7 +1719,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) ...@@ -1750,7 +1719,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT, req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT,
...@@ -1921,7 +1890,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) ...@@ -1921,7 +1890,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN, req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN,
...@@ -2005,7 +1974,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) ...@@ -2005,7 +1974,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action)
int retval = -EIO; int retval = -EIO;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN, req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN,
...@@ -2340,7 +2309,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *unit, u8 tm_flags) ...@@ -2340,7 +2309,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *unit, u8 tm_flags)
return NULL; return NULL;
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND, req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
...@@ -2410,7 +2379,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, ...@@ -2410,7 +2379,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
} }
spin_lock_bh(&qdio->req_q_lock); spin_lock_bh(&qdio->req_q_lock);
if (zfcp_fsf_req_sbal_get(qdio)) if (zfcp_qdio_sbal_get(qdio))
goto out; goto out;
req = zfcp_fsf_req_create(qdio, fsf_cfdc->command, direction, NULL); req = zfcp_fsf_req_create(qdio, fsf_cfdc->command, direction, NULL);
......
...@@ -246,6 +246,46 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, ...@@ -246,6 +246,46 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
return bytes; return bytes;
} }
static int zfcp_qdio_sbal_check(struct zfcp_qdio *qdio)
{
struct zfcp_qdio_queue *req_q = &qdio->req_q;
spin_lock_bh(&qdio->req_q_lock);
if (atomic_read(&req_q->count))
return 1;
spin_unlock_bh(&qdio->req_q_lock);
return 0;
}
/**
* zfcp_qdio_sbal_get - get free sbal in request queue, wait if necessary
* @qdio: pointer to struct zfcp_qdio
*
* The req_q_lock must be held by the caller of this function, and
* this function may only be called from process context; it will
* sleep when waiting for a free sbal.
*
* Returns: 0 on success, -EIO if there is no free sbal after waiting.
*/
int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio)
{
long ret;
spin_unlock_bh(&qdio->req_q_lock);
ret = wait_event_interruptible_timeout(qdio->req_q_wq,
zfcp_qdio_sbal_check(qdio), 5 * HZ);
if (ret > 0)
return 0;
if (!ret) {
atomic_inc(&qdio->req_q_full);
/* assume hanging outbound queue, try queue recovery */
zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1", NULL);
}
spin_lock_bh(&qdio->req_q_lock);
return -EIO;
}
/** /**
* zfcp_qdio_send - set PCI flag in first SBALE and send req to QDIO * zfcp_qdio_send - set PCI flag in first SBALE and send req to QDIO
* @qdio: pointer to struct zfcp_qdio * @qdio: pointer to struct zfcp_qdio
......
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