diff mbox series

[03/12] scsi: iscsi: Add recv workqueue helpers

Message ID 20220308002747.122682-4-michael.christie@oracle.com
State Superseded
Headers show
Series misc iscsi patches | expand

Commit Message

Mike Christie March 8, 2022, 12:27 a.m. UTC
Add helpers to allow the drivers to run their recv paths from libiscsi's
workqueue.

Signed-off-by: Mike Christie <michael.christie@oracle.com>
---
 drivers/scsi/libiscsi.c | 29 +++++++++++++++++++++++++++--
 include/scsi/libiscsi.h |  4 ++++
 2 files changed, 31 insertions(+), 2 deletions(-)

Comments

Lee Duncan March 10, 2022, 10:50 p.m. UTC | #1
On 3/7/22 16:27, Mike Christie wrote:
> Add helpers to allow the drivers to run their recv paths from libiscsi's
> workqueue.
> 
> Signed-off-by: Mike Christie <michael.christie@oracle.com>
> ---
>   drivers/scsi/libiscsi.c | 29 +++++++++++++++++++++++++++--
>   include/scsi/libiscsi.h |  4 ++++
>   2 files changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
> index fa44445dc75f..fec64cbfa4b6 100644
> --- a/drivers/scsi/libiscsi.c
> +++ b/drivers/scsi/libiscsi.c
> @@ -93,6 +93,16 @@ inline void iscsi_conn_queue_xmit(struct iscsi_conn *conn)
>   }
>   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,
>   				 uint32_t exp_cmdsn, uint32_t max_cmdsn)
>   {
> @@ -1942,7 +1952,7 @@ EXPORT_SYMBOL_GPL(iscsi_suspend_queue);
>   
>   /**
>    * 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
>    * from sending new IO, and if work is queued on the xmit thread
> @@ -1955,7 +1965,7 @@ void iscsi_suspend_tx(struct iscsi_conn *conn)
>   
>   	set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);
>   	if (ihost->workq)
> -		flush_workqueue(ihost->workq);
> +		flush_work(&conn->xmitwork);
>   }
>   EXPORT_SYMBOL_GPL(iscsi_suspend_tx);
>   
> @@ -1965,6 +1975,21 @@ static void iscsi_start_tx(struct iscsi_conn *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.
>    * And we are not busy processing a pdu that is making
> diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
> index b567ea4700e5..522fd16f1dbb 100644
> --- a/include/scsi/libiscsi.h
> +++ b/include/scsi/libiscsi.h
> @@ -201,6 +201,8 @@ struct iscsi_conn {
>   	struct list_head	cmdqueue;	/* data-path cmd queue */
>   	struct list_head	requeue;	/* tasks needing another run */
>   	struct work_struct	xmitwork;	/* per-conn. xmit workqueue */
> +	/* recv */
> +	struct work_struct	recvwork;
>   	unsigned long		flags;		/* ISCSI_CONN_FLAGs */
>   
>   	/* negotiated params */
> @@ -440,8 +442,10 @@ extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
>   extern int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
>   				     enum iscsi_param param, char *buf);
>   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_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...) \
>   	iscsi_cls_conn_printk(prefix, ((struct iscsi_conn *)_c)->cls_conn, \

Reviewed-by: Lee Duncan <lduncan@suse.com>
diff mbox series

Patch

diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
index fa44445dc75f..fec64cbfa4b6 100644
--- a/drivers/scsi/libiscsi.c
+++ b/drivers/scsi/libiscsi.c
@@ -93,6 +93,16 @@  inline void iscsi_conn_queue_xmit(struct iscsi_conn *conn)
 }
 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,
 				 uint32_t exp_cmdsn, uint32_t max_cmdsn)
 {
@@ -1942,7 +1952,7 @@  EXPORT_SYMBOL_GPL(iscsi_suspend_queue);
 
 /**
  * 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
  * from sending new IO, and if work is queued on the xmit thread
@@ -1955,7 +1965,7 @@  void iscsi_suspend_tx(struct iscsi_conn *conn)
 
 	set_bit(ISCSI_CONN_FLAG_SUSPEND_TX, &conn->flags);
 	if (ihost->workq)
-		flush_workqueue(ihost->workq);
+		flush_work(&conn->xmitwork);
 }
 EXPORT_SYMBOL_GPL(iscsi_suspend_tx);
 
@@ -1965,6 +1975,21 @@  static void iscsi_start_tx(struct iscsi_conn *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.
  * And we are not busy processing a pdu that is making
diff --git a/include/scsi/libiscsi.h b/include/scsi/libiscsi.h
index b567ea4700e5..522fd16f1dbb 100644
--- a/include/scsi/libiscsi.h
+++ b/include/scsi/libiscsi.h
@@ -201,6 +201,8 @@  struct iscsi_conn {
 	struct list_head	cmdqueue;	/* data-path cmd queue */
 	struct list_head	requeue;	/* tasks needing another run */
 	struct work_struct	xmitwork;	/* per-conn. xmit workqueue */
+	/* recv */
+	struct work_struct	recvwork;
 	unsigned long		flags;		/* ISCSI_CONN_FLAGs */
 
 	/* negotiated params */
@@ -440,8 +442,10 @@  extern int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn,
 extern int iscsi_conn_get_addr_param(struct sockaddr_storage *addr,
 				     enum iscsi_param param, char *buf);
 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_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...) \
 	iscsi_cls_conn_printk(prefix, ((struct iscsi_conn *)_c)->cls_conn, \