Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull SCSI target patches from Nicholas Bellinger:
 "Here are the remaining target-pending patches for v3.9-rc1.

  The most important one here is the immediate queue starvation
  regression fix for iscsi-target, which addresses a bug that's
  effecting v3.5+ kernels under heavy sustained READ only workloads.
  Thanks alot to Benjamin Estrabaud for helping to track this down!

  Also included is a pSCSI exception bugfix from Asias, along with a
  handful of other minor changes.  Both bugfixes are CC'ed to stable."

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
  target/pscsi: Rename sg_num to nr_vecs in pscsi_get_bio()
  target/pscsi: Fix page increment
  target/pscsi: Drop unnecessary NULL assignment to bio->bi_next
  target: Add __exit annotation for module_exit functions
  iscsi-target: Fix immediate queue starvation regression with DATAIN
This commit is contained in:
Linus Torvalds 2013-03-02 11:43:27 -08:00
commit 986248993d
5 changed files with 15 additions and 11 deletions

View File

@ -3584,6 +3584,10 @@ check_rsp_state:
spin_lock_bh(&cmd->istate_lock); spin_lock_bh(&cmd->istate_lock);
cmd->i_state = ISTATE_SENT_STATUS; cmd->i_state = ISTATE_SENT_STATUS;
spin_unlock_bh(&cmd->istate_lock); spin_unlock_bh(&cmd->istate_lock);
if (atomic_read(&conn->check_immediate_queue))
return 1;
continue; continue;
} else if (ret == 2) { } else if (ret == 2) {
/* Still must send status, /* Still must send status,
@ -3673,7 +3677,7 @@ check_rsp_state:
} }
if (atomic_read(&conn->check_immediate_queue)) if (atomic_read(&conn->check_immediate_queue))
break; return 1;
} }
return 0; return 0;
@ -3717,12 +3721,15 @@ restart:
signal_pending(current)) signal_pending(current))
goto transport_err; goto transport_err;
get_immediate:
ret = handle_immediate_queue(conn); ret = handle_immediate_queue(conn);
if (ret < 0) if (ret < 0)
goto transport_err; goto transport_err;
ret = handle_response_queue(conn); ret = handle_response_queue(conn);
if (ret == -EAGAIN) if (ret == 1)
goto get_immediate;
else if (ret == -EAGAIN)
goto restart; goto restart;
else if (ret < 0) else if (ret < 0)
goto transport_err; goto transport_err;

View File

@ -2598,7 +2598,7 @@ static int __init sbp_init(void)
return 0; return 0;
}; };
static void sbp_exit(void) static void __exit sbp_exit(void)
{ {
sbp_deregister_configfs(); sbp_deregister_configfs();
}; };

View File

@ -631,7 +631,7 @@ static int __init fileio_module_init(void)
return transport_subsystem_register(&fileio_template); return transport_subsystem_register(&fileio_template);
} }
static void fileio_module_exit(void) static void __exit fileio_module_exit(void)
{ {
transport_subsystem_release(&fileio_template); transport_subsystem_release(&fileio_template);
} }

View File

@ -821,7 +821,7 @@ static int __init iblock_module_init(void)
return transport_subsystem_register(&iblock_template); return transport_subsystem_register(&iblock_template);
} }
static void iblock_module_exit(void) static void __exit iblock_module_exit(void)
{ {
transport_subsystem_release(&iblock_template); transport_subsystem_release(&iblock_template);
} }

View File

@ -840,14 +840,14 @@ static void pscsi_bi_endio(struct bio *bio, int error)
bio_put(bio); bio_put(bio);
} }
static inline struct bio *pscsi_get_bio(int sg_num) static inline struct bio *pscsi_get_bio(int nr_vecs)
{ {
struct bio *bio; struct bio *bio;
/* /*
* Use bio_malloc() following the comment in for bio -> struct request * Use bio_malloc() following the comment in for bio -> struct request
* in block/blk-core.c:blk_make_request() * in block/blk-core.c:blk_make_request()
*/ */
bio = bio_kmalloc(GFP_KERNEL, sg_num); bio = bio_kmalloc(GFP_KERNEL, nr_vecs);
if (!bio) { if (!bio) {
pr_err("PSCSI: bio_kmalloc() failed\n"); pr_err("PSCSI: bio_kmalloc() failed\n");
return NULL; return NULL;
@ -940,7 +940,6 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
bio = NULL; bio = NULL;
} }
page++;
len -= bytes; len -= bytes;
data_len -= bytes; data_len -= bytes;
off = 0; off = 0;
@ -952,7 +951,6 @@ fail:
while (*hbio) { while (*hbio) {
bio = *hbio; bio = *hbio;
*hbio = (*hbio)->bi_next; *hbio = (*hbio)->bi_next;
bio->bi_next = NULL;
bio_endio(bio, 0); /* XXX: should be error */ bio_endio(bio, 0); /* XXX: should be error */
} }
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
@ -1092,7 +1090,6 @@ fail_free_bio:
while (hbio) { while (hbio) {
struct bio *bio = hbio; struct bio *bio = hbio;
hbio = hbio->bi_next; hbio = hbio->bi_next;
bio->bi_next = NULL;
bio_endio(bio, 0); /* XXX: should be error */ bio_endio(bio, 0); /* XXX: should be error */
} }
ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
@ -1178,7 +1175,7 @@ static int __init pscsi_module_init(void)
return transport_subsystem_register(&pscsi_template); return transport_subsystem_register(&pscsi_template);
} }
static void pscsi_module_exit(void) static void __exit pscsi_module_exit(void)
{ {
transport_subsystem_release(&pscsi_template); transport_subsystem_release(&pscsi_template);
} }