Re: [PATCH 1/2] scsi: explicitly release bidi buffers

2014-03-26 Thread Christoph Hellwig
Now that LSF is done can I get anyone excited to review these?

On Wed, Mar 12, 2014 at 04:06:06AM -0700, Christoph Hellwig wrote:
 Instead of trying to guess when we have a BIDI buffer in scsi_release_buffers
 add a function to explicitly free the BIDI ressoures in the one place that
 handles them.  This avoids needing a special __scsi_release_buffers for the
 case where we already have freed the request as well.
 
 Signed-off-by: Christoph Hellwig h...@lst.de
 
 diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
 index debe30a..3012700 100644
 --- a/drivers/scsi/scsi_lib.c
 +++ b/drivers/scsi/scsi_lib.c
 @@ -511,8 +511,6 @@ void scsi_run_host_queues(struct Scsi_Host *shost)
   scsi_run_queue(sdev-request_queue);
  }
  
 -static void __scsi_release_buffers(struct scsi_cmnd *, int);
 -
  /*
   * Function:scsi_end_request()
   *
 @@ -568,7 +566,7 @@ static struct scsi_cmnd *scsi_end_request(struct 
 scsi_cmnd *cmd, int error,
* This will goose the queue request function at the end, so we don't
* need to worry about launching another command.
*/
 - __scsi_release_buffers(cmd, 0);
 + scsi_release_buffers(cmd);
   scsi_next_command(cmd);
   return NULL;
  }
 @@ -624,30 +622,10 @@ static void scsi_free_sgtable(struct scsi_data_buffer 
 *sdb)
   __sg_free_table(sdb-table, SCSI_MAX_SG_SEGMENTS, scsi_sg_free);
  }
  
 -static void __scsi_release_buffers(struct scsi_cmnd *cmd, int do_bidi_check)
 -{
 -
 - if (cmd-sdb.table.nents)
 - scsi_free_sgtable(cmd-sdb);
 -
 - memset(cmd-sdb, 0, sizeof(cmd-sdb));
 -
 - if (do_bidi_check  scsi_bidi_cmnd(cmd)) {
 - struct scsi_data_buffer *bidi_sdb =
 - cmd-request-next_rq-special;
 - scsi_free_sgtable(bidi_sdb);
 - kmem_cache_free(scsi_sdb_cache, bidi_sdb);
 - cmd-request-next_rq-special = NULL;
 - }
 -
 - if (scsi_prot_sg_count(cmd))
 - scsi_free_sgtable(cmd-prot_sdb);
 -}
 -
  /*
   * Function:scsi_release_buffers()
   *
 - * Purpose: Completion processing for block device I/O requests.
 + * Purpose: Free resources allocate for a scsi_command.
   *
   * Arguments:   cmd  - command that we are bailing.
   *
 @@ -658,15 +636,29 @@ static void __scsi_release_buffers(struct scsi_cmnd 
 *cmd, int do_bidi_check)
   * Notes:   In the event that an upper level driver rejects a
   *   command, we must release resources allocated during
   *   the __init_io() function.  Primarily this would involve
 - *   the scatter-gather table, and potentially any bounce
 - *   buffers.
 + *   the scatter-gather table.
   */
  void scsi_release_buffers(struct scsi_cmnd *cmd)
  {
 - __scsi_release_buffers(cmd, 1);
 + if (cmd-sdb.table.nents)
 + scsi_free_sgtable(cmd-sdb);
 +
 + memset(cmd-sdb, 0, sizeof(cmd-sdb));
 +
 + if (scsi_prot_sg_count(cmd))
 + scsi_free_sgtable(cmd-prot_sdb);
  }
  EXPORT_SYMBOL(scsi_release_buffers);
  
 +static void scsi_release_bidi_buffers(struct scsi_cmnd *cmd)
 +{
 + struct scsi_data_buffer *bidi_sdb = cmd-request-next_rq-special;
 +
 + scsi_free_sgtable(bidi_sdb);
 + kmem_cache_free(scsi_sdb_cache, bidi_sdb);
 + cmd-request-next_rq-special = NULL;
 +}
 +
  /**
   * __scsi_error_from_host_byte - translate SCSI error code into errno
   * @cmd: SCSI command (unused)
 @@ -799,6 +791,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned 
 int good_bytes)
   req-next_rq-resid_len = scsi_in(cmd)-resid;
  
   scsi_release_buffers(cmd);
 + scsi_release_bidi_buffers(cmd);
   blk_end_request_all(req, 0);
  
   scsi_next_command(cmd);
 --
 To unsubscribe from this list: send the line unsubscribe linux-scsi in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
---end quoted text---
--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] scsi: explicitly release bidi buffers

2014-03-12 Thread Christoph Hellwig
Instead of trying to guess when we have a BIDI buffer in scsi_release_buffers
add a function to explicitly free the BIDI ressoures in the one place that
handles them.  This avoids needing a special __scsi_release_buffers for the
case where we already have freed the request as well.

Signed-off-by: Christoph Hellwig h...@lst.de

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index debe30a..3012700 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -511,8 +511,6 @@ void scsi_run_host_queues(struct Scsi_Host *shost)
scsi_run_queue(sdev-request_queue);
 }
 
-static void __scsi_release_buffers(struct scsi_cmnd *, int);
-
 /*
  * Function:scsi_end_request()
  *
@@ -568,7 +566,7 @@ static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd 
*cmd, int error,
 * This will goose the queue request function at the end, so we don't
 * need to worry about launching another command.
 */
-   __scsi_release_buffers(cmd, 0);
+   scsi_release_buffers(cmd);
scsi_next_command(cmd);
return NULL;
 }
@@ -624,30 +622,10 @@ static void scsi_free_sgtable(struct scsi_data_buffer 
*sdb)
__sg_free_table(sdb-table, SCSI_MAX_SG_SEGMENTS, scsi_sg_free);
 }
 
-static void __scsi_release_buffers(struct scsi_cmnd *cmd, int do_bidi_check)
-{
-
-   if (cmd-sdb.table.nents)
-   scsi_free_sgtable(cmd-sdb);
-
-   memset(cmd-sdb, 0, sizeof(cmd-sdb));
-
-   if (do_bidi_check  scsi_bidi_cmnd(cmd)) {
-   struct scsi_data_buffer *bidi_sdb =
-   cmd-request-next_rq-special;
-   scsi_free_sgtable(bidi_sdb);
-   kmem_cache_free(scsi_sdb_cache, bidi_sdb);
-   cmd-request-next_rq-special = NULL;
-   }
-
-   if (scsi_prot_sg_count(cmd))
-   scsi_free_sgtable(cmd-prot_sdb);
-}
-
 /*
  * Function:scsi_release_buffers()
  *
- * Purpose: Completion processing for block device I/O requests.
+ * Purpose: Free resources allocate for a scsi_command.
  *
  * Arguments:   cmd- command that we are bailing.
  *
@@ -658,15 +636,29 @@ static void __scsi_release_buffers(struct scsi_cmnd *cmd, 
int do_bidi_check)
  * Notes:   In the event that an upper level driver rejects a
  * command, we must release resources allocated during
  * the __init_io() function.  Primarily this would involve
- * the scatter-gather table, and potentially any bounce
- * buffers.
+ * the scatter-gather table.
  */
 void scsi_release_buffers(struct scsi_cmnd *cmd)
 {
-   __scsi_release_buffers(cmd, 1);
+   if (cmd-sdb.table.nents)
+   scsi_free_sgtable(cmd-sdb);
+
+   memset(cmd-sdb, 0, sizeof(cmd-sdb));
+
+   if (scsi_prot_sg_count(cmd))
+   scsi_free_sgtable(cmd-prot_sdb);
 }
 EXPORT_SYMBOL(scsi_release_buffers);
 
+static void scsi_release_bidi_buffers(struct scsi_cmnd *cmd)
+{
+   struct scsi_data_buffer *bidi_sdb = cmd-request-next_rq-special;
+
+   scsi_free_sgtable(bidi_sdb);
+   kmem_cache_free(scsi_sdb_cache, bidi_sdb);
+   cmd-request-next_rq-special = NULL;
+}
+
 /**
  * __scsi_error_from_host_byte - translate SCSI error code into errno
  * @cmd:   SCSI command (unused)
@@ -799,6 +791,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int 
good_bytes)
req-next_rq-resid_len = scsi_in(cmd)-resid;
 
scsi_release_buffers(cmd);
+   scsi_release_bidi_buffers(cmd);
blk_end_request_all(req, 0);
 
scsi_next_command(cmd);
--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html