aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei Hu (Xavier) <xavier.huwei@huawei.com>2016-11-23 14:41:07 -0500
committerDoug Ledford <dledford@redhat.com>2016-12-03 14:20:42 -0500
commit5e6ff78a229c2f231f2f743b017987621e469858 (patch)
treefbb406e838608a9847c2ef56d8a36b56460eca17
parentdd783a212c023b309e91ab9752c07e22f759461e (diff)
IB/hns: Change qpn allocation to round-robin mode.
When using CM to establish connections, qp number that was freed just now will be rejected by ib core. To fix these problem, We change qpn allocation to round-robin mode. We added the round-robin mode for allocating resources using bitmap. We use round-robin mode for qp number and non round-robing mode for other resources like cq number, pd number etc. Signed-off-by: Wei Hu (Xavier) <xavier.huwei@huawei.com> Signed-off-by: Salil Mehta <salil.mehta@huawei.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_alloc.c11
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_cq.c4
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_device.h9
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_mr.c2
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_pd.c5
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_qp.c2
6 files changed, 21 insertions, 12 deletions
diff --git a/drivers/infiniband/hw/hns/hns_roce_alloc.c b/drivers/infiniband/hw/hns/hns_roce_alloc.c
index 863a17a2de40..605962f2828c 100644
--- a/drivers/infiniband/hw/hns/hns_roce_alloc.c
+++ b/drivers/infiniband/hw/hns/hns_roce_alloc.c
@@ -61,9 +61,10 @@ int hns_roce_bitmap_alloc(struct hns_roce_bitmap *bitmap, unsigned long *obj)
61 return ret; 61 return ret;
62} 62}
63 63
64void hns_roce_bitmap_free(struct hns_roce_bitmap *bitmap, unsigned long obj) 64void hns_roce_bitmap_free(struct hns_roce_bitmap *bitmap, unsigned long obj,
65 int rr)
65{ 66{
66 hns_roce_bitmap_free_range(bitmap, obj, 1); 67 hns_roce_bitmap_free_range(bitmap, obj, 1, rr);
67} 68}
68 69
69int hns_roce_bitmap_alloc_range(struct hns_roce_bitmap *bitmap, int cnt, 70int hns_roce_bitmap_alloc_range(struct hns_roce_bitmap *bitmap, int cnt,
@@ -106,7 +107,8 @@ int hns_roce_bitmap_alloc_range(struct hns_roce_bitmap *bitmap, int cnt,
106} 107}
107 108
108void hns_roce_bitmap_free_range(struct hns_roce_bitmap *bitmap, 109void hns_roce_bitmap_free_range(struct hns_roce_bitmap *bitmap,
109 unsigned long obj, int cnt) 110 unsigned long obj, int cnt,
111 int rr)
110{ 112{
111 int i; 113 int i;
112 114
@@ -116,7 +118,8 @@ void hns_roce_bitmap_free_range(struct hns_roce_bitmap *bitmap,
116 for (i = 0; i < cnt; i++) 118 for (i = 0; i < cnt; i++)
117 clear_bit(obj + i, bitmap->table); 119 clear_bit(obj + i, bitmap->table);
118 120
119 bitmap->last = min(bitmap->last, obj); 121 if (!rr)
122 bitmap->last = min(bitmap->last, obj);
120 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top) 123 bitmap->top = (bitmap->top + bitmap->max + bitmap->reserved_top)
121 & bitmap->mask; 124 & bitmap->mask;
122 spin_unlock(&bitmap->lock); 125 spin_unlock(&bitmap->lock);
diff --git a/drivers/infiniband/hw/hns/hns_roce_cq.c b/drivers/infiniband/hw/hns/hns_roce_cq.c
index 461a27330e83..c9f6c3dce83c 100644
--- a/drivers/infiniband/hw/hns/hns_roce_cq.c
+++ b/drivers/infiniband/hw/hns/hns_roce_cq.c
@@ -166,7 +166,7 @@ err_put:
166 hns_roce_table_put(hr_dev, &cq_table->table, hr_cq->cqn); 166 hns_roce_table_put(hr_dev, &cq_table->table, hr_cq->cqn);
167 167
168err_out: 168err_out:
169 hns_roce_bitmap_free(&cq_table->bitmap, hr_cq->cqn); 169 hns_roce_bitmap_free(&cq_table->bitmap, hr_cq->cqn, BITMAP_NO_RR);
170 return ret; 170 return ret;
171} 171}
172 172
@@ -204,7 +204,7 @@ static void hns_roce_free_cq(struct hns_roce_dev *hr_dev,
204 spin_unlock_irq(&cq_table->lock); 204 spin_unlock_irq(&cq_table->lock);
205 205
206 hns_roce_table_put(hr_dev, &cq_table->table, hr_cq->cqn); 206 hns_roce_table_put(hr_dev, &cq_table->table, hr_cq->cqn);
207 hns_roce_bitmap_free(&cq_table->bitmap, hr_cq->cqn); 207 hns_roce_bitmap_free(&cq_table->bitmap, hr_cq->cqn, BITMAP_NO_RR);
208} 208}
209 209
210static int hns_roce_ib_get_cq_umem(struct hns_roce_dev *hr_dev, 210static int hns_roce_ib_get_cq_umem(struct hns_roce_dev *hr_dev,
diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
index 7242b1438873..593a42a198f6 100644
--- a/drivers/infiniband/hw/hns/hns_roce_device.h
+++ b/drivers/infiniband/hw/hns/hns_roce_device.h
@@ -72,6 +72,9 @@
72#define HNS_ROCE_MAX_GID_NUM 16 72#define HNS_ROCE_MAX_GID_NUM 16
73#define HNS_ROCE_GID_SIZE 16 73#define HNS_ROCE_GID_SIZE 16
74 74
75#define BITMAP_NO_RR 0
76#define BITMAP_RR 1
77
75#define MR_TYPE_MR 0x00 78#define MR_TYPE_MR 0x00
76#define MR_TYPE_DMA 0x03 79#define MR_TYPE_DMA 0x03
77 80
@@ -661,7 +664,8 @@ void hns_roce_cleanup_cq_table(struct hns_roce_dev *hr_dev);
661void hns_roce_cleanup_qp_table(struct hns_roce_dev *hr_dev); 664void hns_roce_cleanup_qp_table(struct hns_roce_dev *hr_dev);
662 665
663int hns_roce_bitmap_alloc(struct hns_roce_bitmap *bitmap, unsigned long *obj); 666int hns_roce_bitmap_alloc(struct hns_roce_bitmap *bitmap, unsigned long *obj);
664void hns_roce_bitmap_free(struct hns_roce_bitmap *bitmap, unsigned long obj); 667void hns_roce_bitmap_free(struct hns_roce_bitmap *bitmap, unsigned long obj,
668 int rr);
665int hns_roce_bitmap_init(struct hns_roce_bitmap *bitmap, u32 num, u32 mask, 669int hns_roce_bitmap_init(struct hns_roce_bitmap *bitmap, u32 num, u32 mask,
666 u32 reserved_bot, u32 resetrved_top); 670 u32 reserved_bot, u32 resetrved_top);
667void hns_roce_bitmap_cleanup(struct hns_roce_bitmap *bitmap); 671void hns_roce_bitmap_cleanup(struct hns_roce_bitmap *bitmap);
@@ -669,7 +673,8 @@ void hns_roce_cleanup_bitmap(struct hns_roce_dev *hr_dev);
669int hns_roce_bitmap_alloc_range(struct hns_roce_bitmap *bitmap, int cnt, 673int hns_roce_bitmap_alloc_range(struct hns_roce_bitmap *bitmap, int cnt,
670 int align, unsigned long *obj); 674 int align, unsigned long *obj);
671void hns_roce_bitmap_free_range(struct hns_roce_bitmap *bitmap, 675void hns_roce_bitmap_free_range(struct hns_roce_bitmap *bitmap,
672 unsigned long obj, int cnt); 676 unsigned long obj, int cnt,
677 int rr);
673 678
674struct ib_ah *hns_roce_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr); 679struct ib_ah *hns_roce_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
675int hns_roce_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr); 680int hns_roce_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr);
diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c
index a5bd64586848..9b8a1ad4ee6c 100644
--- a/drivers/infiniband/hw/hns/hns_roce_mr.c
+++ b/drivers/infiniband/hw/hns/hns_roce_mr.c
@@ -289,7 +289,7 @@ static void hns_roce_mr_free(struct hns_roce_dev *hr_dev,
289 } 289 }
290 290
291 hns_roce_bitmap_free(&hr_dev->mr_table.mtpt_bitmap, 291 hns_roce_bitmap_free(&hr_dev->mr_table.mtpt_bitmap,
292 key_to_hw_index(mr->key)); 292 key_to_hw_index(mr->key), BITMAP_NO_RR);
293} 293}
294 294
295static int hns_roce_mr_enable(struct hns_roce_dev *hr_dev, 295static int hns_roce_mr_enable(struct hns_roce_dev *hr_dev,
diff --git a/drivers/infiniband/hw/hns/hns_roce_pd.c b/drivers/infiniband/hw/hns/hns_roce_pd.c
index 05db7d59812a..a64500fa1145 100644
--- a/drivers/infiniband/hw/hns/hns_roce_pd.c
+++ b/drivers/infiniband/hw/hns/hns_roce_pd.c
@@ -40,7 +40,7 @@ static int hns_roce_pd_alloc(struct hns_roce_dev *hr_dev, unsigned long *pdn)
40 40
41static void hns_roce_pd_free(struct hns_roce_dev *hr_dev, unsigned long pdn) 41static void hns_roce_pd_free(struct hns_roce_dev *hr_dev, unsigned long pdn)
42{ 42{
43 hns_roce_bitmap_free(&hr_dev->pd_bitmap, pdn); 43 hns_roce_bitmap_free(&hr_dev->pd_bitmap, pdn, BITMAP_NO_RR);
44} 44}
45 45
46int hns_roce_init_pd_table(struct hns_roce_dev *hr_dev) 46int hns_roce_init_pd_table(struct hns_roce_dev *hr_dev)
@@ -121,7 +121,8 @@ int hns_roce_uar_alloc(struct hns_roce_dev *hr_dev, struct hns_roce_uar *uar)
121 121
122void hns_roce_uar_free(struct hns_roce_dev *hr_dev, struct hns_roce_uar *uar) 122void hns_roce_uar_free(struct hns_roce_dev *hr_dev, struct hns_roce_uar *uar)
123{ 123{
124 hns_roce_bitmap_free(&hr_dev->uar_table.bitmap, uar->index); 124 hns_roce_bitmap_free(&hr_dev->uar_table.bitmap, uar->index,
125 BITMAP_NO_RR);
125} 126}
126 127
127int hns_roce_init_uar_table(struct hns_roce_dev *hr_dev) 128int hns_roce_init_uar_table(struct hns_roce_dev *hr_dev)
diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c
index e86dd8d06777..4775b5c725a9 100644
--- a/drivers/infiniband/hw/hns/hns_roce_qp.c
+++ b/drivers/infiniband/hw/hns/hns_roce_qp.c
@@ -250,7 +250,7 @@ void hns_roce_release_range_qp(struct hns_roce_dev *hr_dev, int base_qpn,
250 if (base_qpn < SQP_NUM) 250 if (base_qpn < SQP_NUM)
251 return; 251 return;
252 252
253 hns_roce_bitmap_free_range(&qp_table->bitmap, base_qpn, cnt); 253 hns_roce_bitmap_free_range(&qp_table->bitmap, base_qpn, cnt, BITMAP_RR);
254} 254}
255 255
256static int hns_roce_set_rq_size(struct hns_roce_dev *hr_dev, 256static int hns_roce_set_rq_size(struct hns_roce_dev *hr_dev,