66
77#include <linux/vmalloc.h>
88#include "rxe.h"
9- #include "rxe_loc.h"
109#include "rxe_queue.h"
1110
12- int rxe_srq_chk_attr (struct rxe_dev * rxe , struct rxe_srq * srq ,
13- struct ib_srq_attr * attr , enum ib_srq_attr_mask mask )
11+ int rxe_srq_chk_init (struct rxe_dev * rxe , struct ib_srq_init_attr * init )
1412{
15- if (srq && srq -> error ) {
16- pr_warn ("srq in error state\n" );
13+ struct ib_srq_attr * attr = & init -> attr ;
14+
15+ if (attr -> max_wr > rxe -> attr .max_srq_wr ) {
16+ pr_warn ("max_wr(%d) > max_srq_wr(%d)\n" ,
17+ attr -> max_wr , rxe -> attr .max_srq_wr );
1718 goto err1 ;
1819 }
1920
20- if (mask & IB_SRQ_MAX_WR ) {
21- if (attr -> max_wr > rxe -> attr .max_srq_wr ) {
22- pr_warn ("max_wr(%d) > max_srq_wr(%d)\n" ,
23- attr -> max_wr , rxe -> attr .max_srq_wr );
24- goto err1 ;
25- }
26-
27- if (attr -> max_wr <= 0 ) {
28- pr_warn ("max_wr(%d) <= 0\n" , attr -> max_wr );
29- goto err1 ;
30- }
31-
32- if (srq && srq -> limit && (attr -> max_wr < srq -> limit )) {
33- pr_warn ("max_wr (%d) < srq->limit (%d)\n" ,
34- attr -> max_wr , srq -> limit );
35- goto err1 ;
36- }
37-
38- if (attr -> max_wr < RXE_MIN_SRQ_WR )
39- attr -> max_wr = RXE_MIN_SRQ_WR ;
21+ if (attr -> max_wr <= 0 ) {
22+ pr_warn ("max_wr(%d) <= 0\n" , attr -> max_wr );
23+ goto err1 ;
4024 }
4125
42- if (mask & IB_SRQ_LIMIT ) {
43- if (attr -> srq_limit > rxe -> attr .max_srq_wr ) {
44- pr_warn ("srq_limit(%d) > max_srq_wr(%d)\n" ,
45- attr -> srq_limit , rxe -> attr .max_srq_wr );
46- goto err1 ;
47- }
26+ if (attr -> max_wr < RXE_MIN_SRQ_WR )
27+ attr -> max_wr = RXE_MIN_SRQ_WR ;
4828
49- if (srq && (attr -> srq_limit > srq -> rq .queue -> buf -> index_mask )) {
50- pr_warn ("srq_limit (%d) > cur limit(%d)\n" ,
51- attr -> srq_limit ,
52- srq -> rq .queue -> buf -> index_mask );
53- goto err1 ;
54- }
29+ if (attr -> max_sge > rxe -> attr .max_srq_sge ) {
30+ pr_warn ("max_sge(%d) > max_srq_sge(%d)\n" ,
31+ attr -> max_sge , rxe -> attr .max_srq_sge );
32+ goto err1 ;
5533 }
5634
57- if (mask == IB_SRQ_INIT_MASK ) {
58- if (attr -> max_sge > rxe -> attr .max_srq_sge ) {
59- pr_warn ("max_sge(%d) > max_srq_sge(%d)\n" ,
60- attr -> max_sge , rxe -> attr .max_srq_sge );
61- goto err1 ;
62- }
63-
64- if (attr -> max_sge < RXE_MIN_SRQ_SGE )
65- attr -> max_sge = RXE_MIN_SRQ_SGE ;
66- }
35+ if (attr -> max_sge < RXE_MIN_SRQ_SGE )
36+ attr -> max_sge = RXE_MIN_SRQ_SGE ;
6737
6838 return 0 ;
6939
@@ -93,8 +63,7 @@ int rxe_srq_from_init(struct rxe_dev *rxe, struct rxe_srq *srq,
9363 spin_lock_init (& srq -> rq .consumer_lock );
9464
9565 type = QUEUE_TYPE_FROM_CLIENT ;
96- q = rxe_queue_init (rxe , & srq -> rq .max_wr ,
97- srq_wqe_size , type );
66+ q = rxe_queue_init (rxe , & srq -> rq .max_wr , srq_wqe_size , type );
9867 if (!q ) {
9968 pr_warn ("unable to allocate queue for srq\n" );
10069 return - ENOMEM ;
@@ -121,6 +90,57 @@ int rxe_srq_from_init(struct rxe_dev *rxe, struct rxe_srq *srq,
12190 return 0 ;
12291}
12392
93+ int rxe_srq_chk_attr (struct rxe_dev * rxe , struct rxe_srq * srq ,
94+ struct ib_srq_attr * attr , enum ib_srq_attr_mask mask )
95+ {
96+ if (srq -> error ) {
97+ pr_warn ("srq in error state\n" );
98+ goto err1 ;
99+ }
100+
101+ if (mask & IB_SRQ_MAX_WR ) {
102+ if (attr -> max_wr > rxe -> attr .max_srq_wr ) {
103+ pr_warn ("max_wr(%d) > max_srq_wr(%d)\n" ,
104+ attr -> max_wr , rxe -> attr .max_srq_wr );
105+ goto err1 ;
106+ }
107+
108+ if (attr -> max_wr <= 0 ) {
109+ pr_warn ("max_wr(%d) <= 0\n" , attr -> max_wr );
110+ goto err1 ;
111+ }
112+
113+ if (srq -> limit && (attr -> max_wr < srq -> limit )) {
114+ pr_warn ("max_wr (%d) < srq->limit (%d)\n" ,
115+ attr -> max_wr , srq -> limit );
116+ goto err1 ;
117+ }
118+
119+ if (attr -> max_wr < RXE_MIN_SRQ_WR )
120+ attr -> max_wr = RXE_MIN_SRQ_WR ;
121+ }
122+
123+ if (mask & IB_SRQ_LIMIT ) {
124+ if (attr -> srq_limit > rxe -> attr .max_srq_wr ) {
125+ pr_warn ("srq_limit(%d) > max_srq_wr(%d)\n" ,
126+ attr -> srq_limit , rxe -> attr .max_srq_wr );
127+ goto err1 ;
128+ }
129+
130+ if (attr -> srq_limit > srq -> rq .queue -> buf -> index_mask ) {
131+ pr_warn ("srq_limit (%d) > cur limit(%d)\n" ,
132+ attr -> srq_limit ,
133+ srq -> rq .queue -> buf -> index_mask );
134+ goto err1 ;
135+ }
136+ }
137+
138+ return 0 ;
139+
140+ err1 :
141+ return - EINVAL ;
142+ }
143+
124144int rxe_srq_from_attr (struct rxe_dev * rxe , struct rxe_srq * srq ,
125145 struct ib_srq_attr * attr , enum ib_srq_attr_mask mask ,
126146 struct rxe_modify_srq_cmd * ucmd , struct ib_udata * udata )
0 commit comments