diff options
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r-- | drivers/scsi/scsi_lib.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index b6e6d801768b..1a7e8d811a08 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
@@ -34,6 +34,13 @@ | |||
34 | #define SG_MEMPOOL_NR ARRAY_SIZE(scsi_sg_pools) | 34 | #define SG_MEMPOOL_NR ARRAY_SIZE(scsi_sg_pools) |
35 | #define SG_MEMPOOL_SIZE 2 | 35 | #define SG_MEMPOOL_SIZE 2 |
36 | 36 | ||
37 | /* | ||
38 | * The maximum number of SG segments that we will put inside a scatterlist | ||
39 | * (unless chaining is used). Should ideally fit inside a single page, to | ||
40 | * avoid a higher order allocation. | ||
41 | */ | ||
42 | #define SCSI_MAX_SG_SEGMENTS 128 | ||
43 | |||
37 | struct scsi_host_sg_pool { | 44 | struct scsi_host_sg_pool { |
38 | size_t size; | 45 | size_t size; |
39 | char *name; | 46 | char *name; |
@@ -45,9 +52,15 @@ struct scsi_host_sg_pool { | |||
45 | static struct scsi_host_sg_pool scsi_sg_pools[] = { | 52 | static struct scsi_host_sg_pool scsi_sg_pools[] = { |
46 | SP(8), | 53 | SP(8), |
47 | SP(16), | 54 | SP(16), |
55 | #if (SCSI_MAX_SG_SEGMENTS > 16) | ||
48 | SP(32), | 56 | SP(32), |
57 | #if (SCSI_MAX_SG_SEGMENTS > 32) | ||
49 | SP(64), | 58 | SP(64), |
59 | #if (SCSI_MAX_SG_SEGMENTS > 64) | ||
50 | SP(128), | 60 | SP(128), |
61 | #endif | ||
62 | #endif | ||
63 | #endif | ||
51 | }; | 64 | }; |
52 | #undef SP | 65 | #undef SP |
53 | 66 | ||
@@ -685,13 +698,6 @@ static struct scsi_cmnd *scsi_end_request(struct scsi_cmnd *cmd, int uptodate, | |||
685 | } | 698 | } |
686 | 699 | ||
687 | /* | 700 | /* |
688 | * The maximum number of SG segments that we will put inside a scatterlist | ||
689 | * (unless chaining is used). Should ideally fit inside a single page, to | ||
690 | * avoid a higher order allocation. | ||
691 | */ | ||
692 | #define SCSI_MAX_SG_SEGMENTS 128 | ||
693 | |||
694 | /* | ||
695 | * Like SCSI_MAX_SG_SEGMENTS, but for archs that have sg chaining. This limit | 701 | * Like SCSI_MAX_SG_SEGMENTS, but for archs that have sg chaining. This limit |
696 | * is totally arbitrary, a setting of 2048 will get you at least 8mb ios. | 702 | * is totally arbitrary, a setting of 2048 will get you at least 8mb ios. |
697 | */ | 703 | */ |
@@ -708,15 +714,21 @@ static inline unsigned int scsi_sgtable_index(unsigned short nents) | |||
708 | case 9 ... 16: | 714 | case 9 ... 16: |
709 | index = 1; | 715 | index = 1; |
710 | break; | 716 | break; |
717 | #if (SCSI_MAX_SG_SEGMENTS > 16) | ||
711 | case 17 ... 32: | 718 | case 17 ... 32: |
712 | index = 2; | 719 | index = 2; |
713 | break; | 720 | break; |
721 | #if (SCSI_MAX_SG_SEGMENTS > 32) | ||
714 | case 33 ... 64: | 722 | case 33 ... 64: |
715 | index = 3; | 723 | index = 3; |
716 | break; | 724 | break; |
717 | case 65 ... SCSI_MAX_SG_SEGMENTS: | 725 | #if (SCSI_MAX_SG_SEGMENTS > 64) |
726 | case 65 ... 128: | ||
718 | index = 4; | 727 | index = 4; |
719 | break; | 728 | break; |
729 | #endif | ||
730 | #endif | ||
731 | #endif | ||
720 | default: | 732 | default: |
721 | printk(KERN_ERR "scsi: bad segment count=%d\n", nents); | 733 | printk(KERN_ERR "scsi: bad segment count=%d\n", nents); |
722 | BUG(); | 734 | BUG(); |