diff options
-rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.c | 27 | ||||
-rw-r--r-- | drivers/infiniband/ulp/srp/ib_srp.h | 13 |
2 files changed, 25 insertions, 15 deletions
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 7f8f16bad753..b8b09a4f012a 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -291,7 +291,7 @@ static void srp_free_target_ib(struct srp_target_port *target) | |||
291 | 291 | ||
292 | for (i = 0; i < SRP_RQ_SIZE; ++i) | 292 | for (i = 0; i < SRP_RQ_SIZE; ++i) |
293 | srp_free_iu(target->srp_host, target->rx_ring[i]); | 293 | srp_free_iu(target->srp_host, target->rx_ring[i]); |
294 | for (i = 0; i < SRP_SQ_SIZE + 1; ++i) | 294 | for (i = 0; i < SRP_SQ_SIZE; ++i) |
295 | srp_free_iu(target->srp_host, target->tx_ring[i]); | 295 | srp_free_iu(target->srp_host, target->tx_ring[i]); |
296 | } | 296 | } |
297 | 297 | ||
@@ -822,7 +822,7 @@ static int srp_post_recv(struct srp_target_port *target) | |||
822 | 822 | ||
823 | spin_lock_irqsave(target->scsi_host->host_lock, flags); | 823 | spin_lock_irqsave(target->scsi_host->host_lock, flags); |
824 | 824 | ||
825 | next = target->rx_head & (SRP_RQ_SIZE - 1); | 825 | next = target->rx_head & SRP_RQ_MASK; |
826 | wr.wr_id = next; | 826 | wr.wr_id = next; |
827 | iu = target->rx_ring[next]; | 827 | iu = target->rx_ring[next]; |
828 | 828 | ||
@@ -989,19 +989,19 @@ static void srp_send_completion(struct ib_cq *cq, void *target_ptr) | |||
989 | static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target, | 989 | static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target, |
990 | enum srp_request_type req_type) | 990 | enum srp_request_type req_type) |
991 | { | 991 | { |
992 | s32 min = (req_type == SRP_REQ_TASK_MGMT) ? 1 : 2; | 992 | s32 rsv = (req_type == SRP_REQ_TASK_MGMT) ? 0 : SRP_TSK_MGMT_SQ_SIZE; |
993 | 993 | ||
994 | srp_send_completion(target->send_cq, target); | 994 | srp_send_completion(target->send_cq, target); |
995 | 995 | ||
996 | if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) | 996 | if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) |
997 | return NULL; | 997 | return NULL; |
998 | 998 | ||
999 | if (target->req_lim < min) { | 999 | if (target->req_lim <= rsv) { |
1000 | ++target->zero_req_lim; | 1000 | ++target->zero_req_lim; |
1001 | return NULL; | 1001 | return NULL; |
1002 | } | 1002 | } |
1003 | 1003 | ||
1004 | return target->tx_ring[target->tx_head & SRP_SQ_SIZE]; | 1004 | return target->tx_ring[target->tx_head & SRP_SQ_MASK]; |
1005 | } | 1005 | } |
1006 | 1006 | ||
1007 | /* | 1007 | /* |
@@ -1020,7 +1020,7 @@ static int __srp_post_send(struct srp_target_port *target, | |||
1020 | list.lkey = target->srp_host->srp_dev->mr->lkey; | 1020 | list.lkey = target->srp_host->srp_dev->mr->lkey; |
1021 | 1021 | ||
1022 | wr.next = NULL; | 1022 | wr.next = NULL; |
1023 | wr.wr_id = target->tx_head & SRP_SQ_SIZE; | 1023 | wr.wr_id = target->tx_head & SRP_SQ_MASK; |
1024 | wr.sg_list = &list; | 1024 | wr.sg_list = &list; |
1025 | wr.num_sge = 1; | 1025 | wr.num_sge = 1; |
1026 | wr.opcode = IB_WR_SEND; | 1026 | wr.opcode = IB_WR_SEND; |
@@ -1121,7 +1121,7 @@ static int srp_alloc_iu_bufs(struct srp_target_port *target) | |||
1121 | goto err; | 1121 | goto err; |
1122 | } | 1122 | } |
1123 | 1123 | ||
1124 | for (i = 0; i < SRP_SQ_SIZE + 1; ++i) { | 1124 | for (i = 0; i < SRP_SQ_SIZE; ++i) { |
1125 | target->tx_ring[i] = srp_alloc_iu(target->srp_host, | 1125 | target->tx_ring[i] = srp_alloc_iu(target->srp_host, |
1126 | srp_max_iu_len, | 1126 | srp_max_iu_len, |
1127 | GFP_KERNEL, DMA_TO_DEVICE); | 1127 | GFP_KERNEL, DMA_TO_DEVICE); |
@@ -1137,7 +1137,7 @@ err: | |||
1137 | target->rx_ring[i] = NULL; | 1137 | target->rx_ring[i] = NULL; |
1138 | } | 1138 | } |
1139 | 1139 | ||
1140 | for (i = 0; i < SRP_SQ_SIZE + 1; ++i) { | 1140 | for (i = 0; i < SRP_SQ_SIZE; ++i) { |
1141 | srp_free_iu(target->srp_host, target->tx_ring[i]); | 1141 | srp_free_iu(target->srp_host, target->tx_ring[i]); |
1142 | target->tx_ring[i] = NULL; | 1142 | target->tx_ring[i] = NULL; |
1143 | } | 1143 | } |
@@ -1626,9 +1626,9 @@ static struct scsi_host_template srp_template = { | |||
1626 | .eh_abort_handler = srp_abort, | 1626 | .eh_abort_handler = srp_abort, |
1627 | .eh_device_reset_handler = srp_reset_device, | 1627 | .eh_device_reset_handler = srp_reset_device, |
1628 | .eh_host_reset_handler = srp_reset_host, | 1628 | .eh_host_reset_handler = srp_reset_host, |
1629 | .can_queue = SRP_SQ_SIZE, | 1629 | .can_queue = SRP_CMD_SQ_SIZE, |
1630 | .this_id = -1, | 1630 | .this_id = -1, |
1631 | .cmd_per_lun = SRP_SQ_SIZE, | 1631 | .cmd_per_lun = SRP_CMD_SQ_SIZE, |
1632 | .use_clustering = ENABLE_CLUSTERING, | 1632 | .use_clustering = ENABLE_CLUSTERING, |
1633 | .shost_attrs = srp_host_attrs | 1633 | .shost_attrs = srp_host_attrs |
1634 | }; | 1634 | }; |
@@ -1813,7 +1813,7 @@ static int srp_parse_options(const char *buf, struct srp_target_port *target) | |||
1813 | printk(KERN_WARNING PFX "bad max cmd_per_lun parameter '%s'\n", p); | 1813 | printk(KERN_WARNING PFX "bad max cmd_per_lun parameter '%s'\n", p); |
1814 | goto out; | 1814 | goto out; |
1815 | } | 1815 | } |
1816 | target->scsi_host->cmd_per_lun = min(token, SRP_SQ_SIZE); | 1816 | target->scsi_host->cmd_per_lun = min(token, SRP_CMD_SQ_SIZE); |
1817 | break; | 1817 | break; |
1818 | 1818 | ||
1819 | case SRP_OPT_IO_CLASS: | 1819 | case SRP_OPT_IO_CLASS: |
@@ -1891,7 +1891,7 @@ static ssize_t srp_create_target(struct device *dev, | |||
1891 | 1891 | ||
1892 | INIT_LIST_HEAD(&target->free_reqs); | 1892 | INIT_LIST_HEAD(&target->free_reqs); |
1893 | INIT_LIST_HEAD(&target->req_queue); | 1893 | INIT_LIST_HEAD(&target->req_queue); |
1894 | for (i = 0; i < SRP_SQ_SIZE; ++i) { | 1894 | for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) { |
1895 | target->req_ring[i].index = i; | 1895 | target->req_ring[i].index = i; |
1896 | list_add_tail(&target->req_ring[i].list, &target->free_reqs); | 1896 | list_add_tail(&target->req_ring[i].list, &target->free_reqs); |
1897 | } | 1897 | } |
@@ -2159,6 +2159,9 @@ static int __init srp_init_module(void) | |||
2159 | { | 2159 | { |
2160 | int ret; | 2160 | int ret; |
2161 | 2161 | ||
2162 | BUILD_BUG_ON_NOT_POWER_OF_2(SRP_SQ_SIZE); | ||
2163 | BUILD_BUG_ON_NOT_POWER_OF_2(SRP_RQ_SIZE); | ||
2164 | |||
2162 | if (srp_sg_tablesize > 255) { | 2165 | if (srp_sg_tablesize > 255) { |
2163 | printk(KERN_WARNING PFX "Clamping srp_sg_tablesize to 255\n"); | 2166 | printk(KERN_WARNING PFX "Clamping srp_sg_tablesize to 255\n"); |
2164 | srp_sg_tablesize = 255; | 2167 | srp_sg_tablesize = 255; |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h index 5a80eac6fdaa..7a959d5f2fa6 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.h +++ b/drivers/infiniband/ulp/srp/ib_srp.h | |||
@@ -59,7 +59,14 @@ enum { | |||
59 | 59 | ||
60 | SRP_RQ_SHIFT = 6, | 60 | SRP_RQ_SHIFT = 6, |
61 | SRP_RQ_SIZE = 1 << SRP_RQ_SHIFT, | 61 | SRP_RQ_SIZE = 1 << SRP_RQ_SHIFT, |
62 | SRP_SQ_SIZE = SRP_RQ_SIZE - 1, | 62 | SRP_RQ_MASK = SRP_RQ_SIZE - 1, |
63 | |||
64 | SRP_SQ_SIZE = SRP_RQ_SIZE, | ||
65 | SRP_SQ_MASK = SRP_SQ_SIZE - 1, | ||
66 | SRP_RSP_SQ_SIZE = 1, | ||
67 | SRP_REQ_SQ_SIZE = SRP_SQ_SIZE - SRP_RSP_SQ_SIZE, | ||
68 | SRP_TSK_MGMT_SQ_SIZE = 1, | ||
69 | SRP_CMD_SQ_SIZE = SRP_REQ_SQ_SIZE - SRP_TSK_MGMT_SQ_SIZE, | ||
63 | 70 | ||
64 | SRP_TAG_TSK_MGMT = 1 << (SRP_RQ_SHIFT + 1), | 71 | SRP_TAG_TSK_MGMT = 1 << (SRP_RQ_SHIFT + 1), |
65 | 72 | ||
@@ -144,11 +151,11 @@ struct srp_target_port { | |||
144 | 151 | ||
145 | unsigned tx_head; | 152 | unsigned tx_head; |
146 | unsigned tx_tail; | 153 | unsigned tx_tail; |
147 | struct srp_iu *tx_ring[SRP_SQ_SIZE + 1]; | 154 | struct srp_iu *tx_ring[SRP_SQ_SIZE]; |
148 | 155 | ||
149 | struct list_head free_reqs; | 156 | struct list_head free_reqs; |
150 | struct list_head req_queue; | 157 | struct list_head req_queue; |
151 | struct srp_request req_ring[SRP_SQ_SIZE]; | 158 | struct srp_request req_ring[SRP_CMD_SQ_SIZE]; |
152 | 159 | ||
153 | struct work_struct work; | 160 | struct work_struct work; |
154 | 161 | ||