scsi: iscsi: Add recv workqueue helpers
Add helpers to allow the drivers to run their recv paths from libiscsi's workqueue. Link: https://lore.kernel.org/r/20220616224557.115234-3-michael.christie@oracle.com Reviewed-by: Lee Duncan <lduncan@suse.com> Signed-off-by: Mike Christie <michael.christie@oracle.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
4b9f8ce4d5
commit
8af809966c
|
@ -93,6 +93,16 @@ inline void iscsi_conn_queue_xmit(struct iscsi_conn *conn)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(iscsi_conn_queue_xmit);
|
EXPORT_SYMBOL_GPL(iscsi_conn_queue_xmit);
|
||||||
|
|
||||||
|
inline void iscsi_conn_queue_recv(struct iscsi_conn *conn)
|
||||||
|
{
|
||||||
|
struct Scsi_Host *shost = conn->session->host;
|
||||||
|
struct iscsi_host *ihost = shost_priv(shost);
|
||||||
|
|
||||||
|
if (ihost->workq && !test_bit(ISCSI_CONN_FLAG_SUSPEND_RX, &conn->flags))
|
||||||
|
queue_work(ihost->workq, &conn->recvwork);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(iscsi_conn_queue_recv);
|
||||||
|
|
||||||
static void __iscsi_update_cmdsn(struct iscsi_session *session,
|
static void __iscsi_update_cmdsn(struct iscsi_session *session,
|
||||||
uint32_t exp_cmdsn, uint32_t max_cmdsn)
|
uint32_t exp_cmdsn, uint32_t max_cmdsn)
|
||||||
{
|
{
|
||||||
|
@ -1947,7 +1957,7 @@ EXPORT_SYMBOL_GPL(iscsi_suspend_queue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iscsi_suspend_tx - suspend iscsi_data_xmit
|
* iscsi_suspend_tx - suspend iscsi_data_xmit
|
||||||
* @conn: iscsi conn tp stop processing IO on.
|
* @conn: iscsi conn to stop processing IO on.
|
||||||
*
|
*
|
||||||
* This function sets the suspend bit to prevent iscsi_data_xmit
|
* This function sets the suspend bit to prevent iscsi_data_xmit
|
||||||
* from sending new IO, and if work is queued on the xmit thread
|
* from sending new IO, and if work is queued on the xmit thread
|
||||||
|
@ -1960,7 +1970,7 @@ void iscsi_suspend_tx(struct iscsi_conn *conn)
|
||||||
|
|
||||||
set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);
|
set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);
|
||||||
if (ihost->workq)
|
if (ihost->workq)
|
||||||
flush_workqueue(ihost->workq);
|
flush_work(&conn->xmitwork);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(iscsi_suspend_tx);
|
EXPORT_SYMBOL_GPL(iscsi_suspend_tx);
|
||||||
|
|
||||||
|
@ -1970,6 +1980,21 @@ static void iscsi_start_tx(struct iscsi_conn *conn)
|
||||||
iscsi_conn_queue_xmit(conn);
|
iscsi_conn_queue_xmit(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* iscsi_suspend_rx - Prevent recvwork from running again.
|
||||||
|
* @conn: iscsi conn to stop.
|
||||||
|
*/
|
||||||
|
void iscsi_suspend_rx(struct iscsi_conn *conn)
|
||||||
|
{
|
||||||
|
struct Scsi_Host *shost = conn->session->host;
|
||||||
|
struct iscsi_host *ihost = shost_priv(shost);
|
||||||
|
|
||||||
|
set_bit(ISCSI_CONN_FLAG_SUSPEND_RX, &conn->flags);
|
||||||
|
if (ihost->workq)
|
||||||
|
flush_work(&conn->recvwork);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(iscsi_suspend_rx);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want to make sure a ping is in flight. It has timed out.
|
* We want to make sure a ping is in flight. It has timed out.
|
||||||
* And we are not busy processing a pdu that is making
|
* And we are not busy processing a pdu that is making
|
||||||
|
|
|
@ -213,6 +213,8 @@ struct iscsi_conn {
|
||||||
struct list_head cmdqueue; /* data-path cmd queue */
|
struct list_head cmdqueue; /* data-path cmd queue */
|
||||||
struct list_head requeue; /* tasks needing another run */
|
struct list_head requeue; /* tasks needing another run */
|
||||||
struct work_struct xmitwork; /* per-conn. xmit workqueue */
|
struct work_struct xmitwork; /* per-conn. xmit workqueue */
|
||||||
|
/* recv */
|
||||||
|
struct work_struct recvwork;
|
||||||
unsigned long flags; /* ISCSI_CONN_FLAGs */
|
unsigned long flags; /* ISCSI_CONN_FLAGs */
|
||||||
|
|
||||||
/* negotiated params */
|
/* negotiated params */
|
||||||
|
@ -452,8 +454,10 @@ extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
|
||||||
extern int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
|
extern int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
|
||||||
enum iscsi_param param, char *buf);
|
enum iscsi_param param, char *buf);
|
||||||
extern void iscsi_suspend_tx(struct iscsi_conn *conn);
|
extern void iscsi_suspend_tx(struct iscsi_conn *conn);
|
||||||
|
extern void iscsi_suspend_rx(struct iscsi_conn *conn);
|
||||||
extern void iscsi_suspend_queue(struct iscsi_conn *conn);
|
extern void iscsi_suspend_queue(struct iscsi_conn *conn);
|
||||||
extern void iscsi_conn_queue_xmit(struct iscsi_conn *conn);
|
extern void iscsi_conn_queue_xmit(struct iscsi_conn *conn);
|
||||||
|
extern void iscsi_conn_queue_recv(struct iscsi_conn *conn);
|
||||||
|
|
||||||
#define iscsi_conn_printk(prefix, _c, fmt, a...) \
|
#define iscsi_conn_printk(prefix, _c, fmt, a...) \
|
||||||
iscsi_cls_conn_printk(prefix, ((struct iscsi_conn *)_c)->cls_conn, \
|
iscsi_cls_conn_printk(prefix, ((struct iscsi_conn *)_c)->cls_conn, \
|
||||||
|
|
Loading…
Reference in New Issue