Skip to content

Commit 8d34ff3

Browse files
author
Roland Dreier
committed
Merge branches 'cxgb3', 'ehca', 'misc', 'mlx4', 'mthca' and 'nes' into for-linus
6 parents 3026c19 + 25a5239 + 5b891a9 + 2ac6bf4 + d1fdf24 + 28e43a5 commit 8d34ff3

File tree

24 files changed

+152
-133
lines changed

24 files changed

+152
-133
lines changed

drivers/infiniband/hw/amso1100/c2_cq.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ static inline int c2_poll_one(struct c2_dev *c2dev,
133133
struct c2_qp *qp;
134134
int is_recv = 0;
135135

136-
ce = (struct c2wr_ce *) c2_mq_consume(&cq->mq);
136+
ce = c2_mq_consume(&cq->mq);
137137
if (!ce) {
138138
return -EAGAIN;
139139
}
@@ -146,7 +146,7 @@ static inline int c2_poll_one(struct c2_dev *c2dev,
146146
while ((qp =
147147
(struct c2_qp *) (unsigned long) ce->qp_user_context) == NULL) {
148148
c2_mq_free(&cq->mq);
149-
ce = (struct c2wr_ce *) c2_mq_consume(&cq->mq);
149+
ce = c2_mq_consume(&cq->mq);
150150
if (!ce)
151151
return -EAGAIN;
152152
}

drivers/infiniband/hw/ehca/ehca_classes_pSeries.h

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ struct hcp_modify_qp_control_block {
165165
#define MQPCB_MASK_ALT_P_KEY_IDX EHCA_BMASK_IBM( 7, 7)
166166
#define MQPCB_MASK_RDMA_ATOMIC_CTRL EHCA_BMASK_IBM( 8, 8)
167167
#define MQPCB_MASK_QP_STATE EHCA_BMASK_IBM( 9, 9)
168-
#define MQPCB_QP_STATE EHCA_BMASK_IBM(24, 31)
169168
#define MQPCB_MASK_RDMA_NR_ATOMIC_RESP_RES EHCA_BMASK_IBM(11, 11)
170169
#define MQPCB_MASK_PATH_MIGRATION_STATE EHCA_BMASK_IBM(12, 12)
171170
#define MQPCB_MASK_RDMA_ATOMIC_OUTST_DEST_QP EHCA_BMASK_IBM(13, 13)
@@ -176,60 +175,33 @@ struct hcp_modify_qp_control_block {
176175
#define MQPCB_MASK_RETRY_COUNT EHCA_BMASK_IBM(18, 18)
177176
#define MQPCB_MASK_TIMEOUT EHCA_BMASK_IBM(19, 19)
178177
#define MQPCB_MASK_PATH_MTU EHCA_BMASK_IBM(20, 20)
179-
#define MQPCB_PATH_MTU EHCA_BMASK_IBM(24, 31)
180178
#define MQPCB_MASK_MAX_STATIC_RATE EHCA_BMASK_IBM(21, 21)
181-
#define MQPCB_MAX_STATIC_RATE EHCA_BMASK_IBM(24, 31)
182179
#define MQPCB_MASK_DLID EHCA_BMASK_IBM(22, 22)
183-
#define MQPCB_DLID EHCA_BMASK_IBM(16, 31)
184180
#define MQPCB_MASK_RNR_RETRY_COUNT EHCA_BMASK_IBM(23, 23)
185-
#define MQPCB_RNR_RETRY_COUNT EHCA_BMASK_IBM(29, 31)
186181
#define MQPCB_MASK_SOURCE_PATH_BITS EHCA_BMASK_IBM(24, 24)
187-
#define MQPCB_SOURCE_PATH_BITS EHCA_BMASK_IBM(25, 31)
188182
#define MQPCB_MASK_TRAFFIC_CLASS EHCA_BMASK_IBM(25, 25)
189-
#define MQPCB_TRAFFIC_CLASS EHCA_BMASK_IBM(24, 31)
190183
#define MQPCB_MASK_HOP_LIMIT EHCA_BMASK_IBM(26, 26)
191-
#define MQPCB_HOP_LIMIT EHCA_BMASK_IBM(24, 31)
192184
#define MQPCB_MASK_SOURCE_GID_IDX EHCA_BMASK_IBM(27, 27)
193-
#define MQPCB_SOURCE_GID_IDX EHCA_BMASK_IBM(24, 31)
194185
#define MQPCB_MASK_FLOW_LABEL EHCA_BMASK_IBM(28, 28)
195-
#define MQPCB_FLOW_LABEL EHCA_BMASK_IBM(12, 31)
196186
#define MQPCB_MASK_DEST_GID EHCA_BMASK_IBM(30, 30)
197187
#define MQPCB_MASK_SERVICE_LEVEL_AL EHCA_BMASK_IBM(31, 31)
198-
#define MQPCB_SERVICE_LEVEL_AL EHCA_BMASK_IBM(28, 31)
199188
#define MQPCB_MASK_SEND_GRH_FLAG_AL EHCA_BMASK_IBM(32, 32)
200-
#define MQPCB_SEND_GRH_FLAG_AL EHCA_BMASK_IBM(31, 31)
201189
#define MQPCB_MASK_RETRY_COUNT_AL EHCA_BMASK_IBM(33, 33)
202-
#define MQPCB_RETRY_COUNT_AL EHCA_BMASK_IBM(29, 31)
203190
#define MQPCB_MASK_TIMEOUT_AL EHCA_BMASK_IBM(34, 34)
204-
#define MQPCB_TIMEOUT_AL EHCA_BMASK_IBM(27, 31)
205191
#define MQPCB_MASK_MAX_STATIC_RATE_AL EHCA_BMASK_IBM(35, 35)
206-
#define MQPCB_MAX_STATIC_RATE_AL EHCA_BMASK_IBM(24, 31)
207192
#define MQPCB_MASK_DLID_AL EHCA_BMASK_IBM(36, 36)
208-
#define MQPCB_DLID_AL EHCA_BMASK_IBM(16, 31)
209193
#define MQPCB_MASK_RNR_RETRY_COUNT_AL EHCA_BMASK_IBM(37, 37)
210-
#define MQPCB_RNR_RETRY_COUNT_AL EHCA_BMASK_IBM(29, 31)
211194
#define MQPCB_MASK_SOURCE_PATH_BITS_AL EHCA_BMASK_IBM(38, 38)
212-
#define MQPCB_SOURCE_PATH_BITS_AL EHCA_BMASK_IBM(25, 31)
213195
#define MQPCB_MASK_TRAFFIC_CLASS_AL EHCA_BMASK_IBM(39, 39)
214-
#define MQPCB_TRAFFIC_CLASS_AL EHCA_BMASK_IBM(24, 31)
215196
#define MQPCB_MASK_HOP_LIMIT_AL EHCA_BMASK_IBM(40, 40)
216-
#define MQPCB_HOP_LIMIT_AL EHCA_BMASK_IBM(24, 31)
217197
#define MQPCB_MASK_SOURCE_GID_IDX_AL EHCA_BMASK_IBM(41, 41)
218-
#define MQPCB_SOURCE_GID_IDX_AL EHCA_BMASK_IBM(24, 31)
219198
#define MQPCB_MASK_FLOW_LABEL_AL EHCA_BMASK_IBM(42, 42)
220-
#define MQPCB_FLOW_LABEL_AL EHCA_BMASK_IBM(12, 31)
221199
#define MQPCB_MASK_DEST_GID_AL EHCA_BMASK_IBM(44, 44)
222200
#define MQPCB_MASK_MAX_NR_OUTST_SEND_WR EHCA_BMASK_IBM(45, 45)
223-
#define MQPCB_MAX_NR_OUTST_SEND_WR EHCA_BMASK_IBM(16, 31)
224201
#define MQPCB_MASK_MAX_NR_OUTST_RECV_WR EHCA_BMASK_IBM(46, 46)
225-
#define MQPCB_MAX_NR_OUTST_RECV_WR EHCA_BMASK_IBM(16, 31)
226202
#define MQPCB_MASK_DISABLE_ETE_CREDIT_CHECK EHCA_BMASK_IBM(47, 47)
227-
#define MQPCB_DISABLE_ETE_CREDIT_CHECK EHCA_BMASK_IBM(31, 31)
228-
#define MQPCB_QP_NUMBER EHCA_BMASK_IBM( 8, 31)
229203
#define MQPCB_MASK_QP_ENABLE EHCA_BMASK_IBM(48, 48)
230-
#define MQPCB_QP_ENABLE EHCA_BMASK_IBM(31, 31)
231204
#define MQPCB_MASK_CURR_SRQ_LIMIT EHCA_BMASK_IBM(49, 49)
232-
#define MQPCB_CURR_SRQ_LIMIT EHCA_BMASK_IBM(16, 31)
233205
#define MQPCB_MASK_QP_AFF_ASYN_EV_LOG_REG EHCA_BMASK_IBM(50, 50)
234206
#define MQPCB_MASK_SHARED_RQ_HNDL EHCA_BMASK_IBM(51, 51)
235207

drivers/infiniband/hw/ehca/ehca_irq.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -479,13 +479,13 @@ void ehca_tasklet_neq(unsigned long data)
479479
struct ehca_eqe *eqe;
480480
u64 ret;
481481

482-
eqe = (struct ehca_eqe *)ehca_poll_eq(shca, &shca->neq);
482+
eqe = ehca_poll_eq(shca, &shca->neq);
483483

484484
while (eqe) {
485485
if (!EHCA_BMASK_GET(NEQE_COMPLETION_EVENT, eqe->entry))
486486
parse_ec(shca, eqe->entry);
487487

488-
eqe = (struct ehca_eqe *)ehca_poll_eq(shca, &shca->neq);
488+
eqe = ehca_poll_eq(shca, &shca->neq);
489489
}
490490

491491
ret = hipz_h_reset_event(shca->ipz_hca_handle,
@@ -572,8 +572,7 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
572572
eqe_cnt = 0;
573573
do {
574574
u32 token;
575-
eqe_cache[eqe_cnt].eqe =
576-
(struct ehca_eqe *)ehca_poll_eq(shca, eq);
575+
eqe_cache[eqe_cnt].eqe = ehca_poll_eq(shca, eq);
577576
if (!eqe_cache[eqe_cnt].eqe)
578577
break;
579578
eqe_value = eqe_cache[eqe_cnt].eqe->entry;
@@ -637,7 +636,7 @@ void ehca_process_eq(struct ehca_shca *shca, int is_irq)
637636
goto unlock_irq_spinlock;
638637
do {
639638
struct ehca_eqe *eqe;
640-
eqe = (struct ehca_eqe *)ehca_poll_eq(shca, &shca->eq);
639+
eqe = ehca_poll_eq(shca, &shca->eq);
641640
if (!eqe)
642641
break;
643642
process_eqe(shca, eqe);

drivers/infiniband/hw/ehca/ehca_main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
#include "ehca_tools.h"
5353
#include "hcp_if.h"
5454

55-
#define HCAD_VERSION "0026"
55+
#define HCAD_VERSION "0027"
5656

5757
MODULE_LICENSE("Dual BSD/GPL");
5858
MODULE_AUTHOR("Christoph Raisch <[email protected]>");

drivers/infiniband/hw/ehca/ehca_qp.c

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -461,7 +461,7 @@ static struct ehca_qp *internal_create_qp(
461461
ib_device);
462462
struct ib_ucontext *context = NULL;
463463
u64 h_ret;
464-
int is_llqp = 0, has_srq = 0;
464+
int is_llqp = 0, has_srq = 0, is_user = 0;
465465
int qp_type, max_send_sge, max_recv_sge, ret;
466466

467467
/* h_call's out parameters */
@@ -609,16 +609,18 @@ static struct ehca_qp *internal_create_qp(
609609
}
610610
}
611611

612-
if (pd->uobject && udata)
613-
context = pd->uobject->context;
614-
615612
my_qp = kmem_cache_zalloc(qp_cache, GFP_KERNEL);
616613
if (!my_qp) {
617614
ehca_err(pd->device, "pd=%p not enough memory to alloc qp", pd);
618615
atomic_dec(&shca->num_qps);
619616
return ERR_PTR(-ENOMEM);
620617
}
621618

619+
if (pd->uobject && udata) {
620+
is_user = 1;
621+
context = pd->uobject->context;
622+
}
623+
622624
atomic_set(&my_qp->nr_events, 0);
623625
init_waitqueue_head(&my_qp->wait_completion);
624626
spin_lock_init(&my_qp->spinlock_s);
@@ -707,7 +709,7 @@ static struct ehca_qp *internal_create_qp(
707709
(parms.squeue.is_small || parms.rqueue.is_small);
708710
}
709711

710-
h_ret = hipz_h_alloc_resource_qp(shca->ipz_hca_handle, &parms);
712+
h_ret = hipz_h_alloc_resource_qp(shca->ipz_hca_handle, &parms, is_user);
711713
if (h_ret != H_SUCCESS) {
712714
ehca_err(pd->device, "h_alloc_resource_qp() failed h_ret=%lli",
713715
h_ret);
@@ -769,18 +771,20 @@ static struct ehca_qp *internal_create_qp(
769771
goto create_qp_exit2;
770772
}
771773

772-
my_qp->sq_map.entries = my_qp->ipz_squeue.queue_length /
773-
my_qp->ipz_squeue.qe_size;
774-
my_qp->sq_map.map = vmalloc(my_qp->sq_map.entries *
775-
sizeof(struct ehca_qmap_entry));
776-
if (!my_qp->sq_map.map) {
777-
ehca_err(pd->device, "Couldn't allocate squeue "
778-
"map ret=%i", ret);
779-
goto create_qp_exit3;
774+
if (!is_user) {
775+
my_qp->sq_map.entries = my_qp->ipz_squeue.queue_length /
776+
my_qp->ipz_squeue.qe_size;
777+
my_qp->sq_map.map = vmalloc(my_qp->sq_map.entries *
778+
sizeof(struct ehca_qmap_entry));
779+
if (!my_qp->sq_map.map) {
780+
ehca_err(pd->device, "Couldn't allocate squeue "
781+
"map ret=%i", ret);
782+
goto create_qp_exit3;
783+
}
784+
INIT_LIST_HEAD(&my_qp->sq_err_node);
785+
/* to avoid the generation of bogus flush CQEs */
786+
reset_queue_map(&my_qp->sq_map);
780787
}
781-
INIT_LIST_HEAD(&my_qp->sq_err_node);
782-
/* to avoid the generation of bogus flush CQEs */
783-
reset_queue_map(&my_qp->sq_map);
784788
}
785789

786790
if (HAS_RQ(my_qp)) {
@@ -792,20 +796,21 @@ static struct ehca_qp *internal_create_qp(
792796
"and pages ret=%i", ret);
793797
goto create_qp_exit4;
794798
}
795-
796-
my_qp->rq_map.entries = my_qp->ipz_rqueue.queue_length /
797-
my_qp->ipz_rqueue.qe_size;
798-
my_qp->rq_map.map = vmalloc(my_qp->rq_map.entries *
799-
sizeof(struct ehca_qmap_entry));
800-
if (!my_qp->rq_map.map) {
801-
ehca_err(pd->device, "Couldn't allocate squeue "
802-
"map ret=%i", ret);
803-
goto create_qp_exit5;
799+
if (!is_user) {
800+
my_qp->rq_map.entries = my_qp->ipz_rqueue.queue_length /
801+
my_qp->ipz_rqueue.qe_size;
802+
my_qp->rq_map.map = vmalloc(my_qp->rq_map.entries *
803+
sizeof(struct ehca_qmap_entry));
804+
if (!my_qp->rq_map.map) {
805+
ehca_err(pd->device, "Couldn't allocate squeue "
806+
"map ret=%i", ret);
807+
goto create_qp_exit5;
808+
}
809+
INIT_LIST_HEAD(&my_qp->rq_err_node);
810+
/* to avoid the generation of bogus flush CQEs */
811+
reset_queue_map(&my_qp->rq_map);
804812
}
805-
INIT_LIST_HEAD(&my_qp->rq_err_node);
806-
/* to avoid the generation of bogus flush CQEs */
807-
reset_queue_map(&my_qp->rq_map);
808-
} else if (init_attr->srq) {
813+
} else if (init_attr->srq && !is_user) {
809814
/* this is a base QP, use the queue map of the SRQ */
810815
my_qp->rq_map = my_srq->rq_map;
811816
INIT_LIST_HEAD(&my_qp->rq_err_node);
@@ -918,15 +923,15 @@ static struct ehca_qp *internal_create_qp(
918923
kfree(my_qp->mod_qp_parm);
919924

920925
create_qp_exit6:
921-
if (HAS_RQ(my_qp))
926+
if (HAS_RQ(my_qp) && !is_user)
922927
vfree(my_qp->rq_map.map);
923928

924929
create_qp_exit5:
925930
if (HAS_RQ(my_qp))
926931
ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue);
927932

928933
create_qp_exit4:
929-
if (HAS_SQ(my_qp))
934+
if (HAS_SQ(my_qp) && !is_user)
930935
vfree(my_qp->sq_map.map);
931936

932937
create_qp_exit3:
@@ -1244,6 +1249,7 @@ static int internal_modify_qp(struct ib_qp *ibqp,
12441249
u64 update_mask;
12451250
u64 h_ret;
12461251
int bad_wqe_cnt = 0;
1252+
int is_user = 0;
12471253
int squeue_locked = 0;
12481254
unsigned long flags = 0;
12491255

@@ -1266,6 +1272,8 @@ static int internal_modify_qp(struct ib_qp *ibqp,
12661272
ret = ehca2ib_return_code(h_ret);
12671273
goto modify_qp_exit1;
12681274
}
1275+
if (ibqp->uobject)
1276+
is_user = 1;
12691277

12701278
qp_cur_state = ehca2ib_qp_state(mqpcb->qp_state);
12711279

@@ -1728,7 +1736,8 @@ static int internal_modify_qp(struct ib_qp *ibqp,
17281736
goto modify_qp_exit2;
17291737
}
17301738
}
1731-
if ((qp_new_state == IB_QPS_ERR) && (qp_cur_state != IB_QPS_ERR)) {
1739+
if ((qp_new_state == IB_QPS_ERR) && (qp_cur_state != IB_QPS_ERR)
1740+
&& !is_user) {
17321741
ret = check_for_left_cqes(my_qp, shca);
17331742
if (ret)
17341743
goto modify_qp_exit2;
@@ -1738,16 +1747,17 @@ static int internal_modify_qp(struct ib_qp *ibqp,
17381747
ipz_qeit_reset(&my_qp->ipz_rqueue);
17391748
ipz_qeit_reset(&my_qp->ipz_squeue);
17401749

1741-
if (qp_cur_state == IB_QPS_ERR) {
1750+
if (qp_cur_state == IB_QPS_ERR && !is_user) {
17421751
del_from_err_list(my_qp->send_cq, &my_qp->sq_err_node);
17431752

17441753
if (HAS_RQ(my_qp))
17451754
del_from_err_list(my_qp->recv_cq,
17461755
&my_qp->rq_err_node);
17471756
}
1748-
reset_queue_map(&my_qp->sq_map);
1757+
if (!is_user)
1758+
reset_queue_map(&my_qp->sq_map);
17491759

1750-
if (HAS_RQ(my_qp))
1760+
if (HAS_RQ(my_qp) && !is_user)
17511761
reset_queue_map(&my_qp->rq_map);
17521762
}
17531763

@@ -1952,19 +1962,13 @@ int ehca_query_qp(struct ib_qp *qp,
19521962
qp_attr->cap.max_inline_data = my_qp->sq_max_inline_data_size;
19531963
qp_attr->dest_qp_num = qpcb->dest_qp_nr;
19541964

1955-
qp_attr->pkey_index =
1956-
EHCA_BMASK_GET(MQPCB_PRIM_P_KEY_IDX, qpcb->prim_p_key_idx);
1957-
1958-
qp_attr->port_num =
1959-
EHCA_BMASK_GET(MQPCB_PRIM_PHYS_PORT, qpcb->prim_phys_port);
1960-
1965+
qp_attr->pkey_index = qpcb->prim_p_key_idx;
1966+
qp_attr->port_num = qpcb->prim_phys_port;
19611967
qp_attr->timeout = qpcb->timeout;
19621968
qp_attr->retry_cnt = qpcb->retry_count;
19631969
qp_attr->rnr_retry = qpcb->rnr_retry_count;
19641970

1965-
qp_attr->alt_pkey_index =
1966-
EHCA_BMASK_GET(MQPCB_PRIM_P_KEY_IDX, qpcb->alt_p_key_idx);
1967-
1971+
qp_attr->alt_pkey_index = qpcb->alt_p_key_idx;
19681972
qp_attr->alt_port_num = qpcb->alt_phys_port;
19691973
qp_attr->alt_timeout = qpcb->timeout_al;
19701974

@@ -2051,8 +2055,7 @@ int ehca_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
20512055
update_mask |=
20522056
EHCA_BMASK_SET(MQPCB_MASK_CURR_SRQ_LIMIT, 1)
20532057
| EHCA_BMASK_SET(MQPCB_MASK_QP_AFF_ASYN_EV_LOG_REG, 1);
2054-
mqpcb->curr_srq_limit =
2055-
EHCA_BMASK_SET(MQPCB_CURR_SRQ_LIMIT, attr->srq_limit);
2058+
mqpcb->curr_srq_limit = attr->srq_limit;
20562059
mqpcb->qp_aff_asyn_ev_log_reg =
20572060
EHCA_BMASK_SET(QPX_AAELOG_RESET_SRQ_LIMIT, 1);
20582061
}
@@ -2115,8 +2118,7 @@ int ehca_query_srq(struct ib_srq *srq, struct ib_srq_attr *srq_attr)
21152118

21162119
srq_attr->max_wr = qpcb->max_nr_outst_recv_wr - 1;
21172120
srq_attr->max_sge = 3;
2118-
srq_attr->srq_limit = EHCA_BMASK_GET(
2119-
MQPCB_CURR_SRQ_LIMIT, qpcb->curr_srq_limit);
2121+
srq_attr->srq_limit = qpcb->curr_srq_limit;
21202122

21212123
if (ehca_debug_level >= 2)
21222124
ehca_dmp(qpcb, 4*70, "qp_num=%x", my_qp->real_qp_num);
@@ -2138,10 +2140,12 @@ static int internal_destroy_qp(struct ib_device *dev, struct ehca_qp *my_qp,
21382140
int ret;
21392141
u64 h_ret;
21402142
u8 port_num;
2143+
int is_user = 0;
21412144
enum ib_qp_type qp_type;
21422145
unsigned long flags;
21432146

21442147
if (uobject) {
2148+
is_user = 1;
21452149
if (my_qp->mm_count_galpa ||
21462150
my_qp->mm_count_rqueue || my_qp->mm_count_squeue) {
21472151
ehca_err(dev, "Resources still referenced in "
@@ -2168,10 +2172,10 @@ static int internal_destroy_qp(struct ib_device *dev, struct ehca_qp *my_qp,
21682172
* SRQs will never get into an error list and do not have a recv_cq,
21692173
* so we need to skip them here.
21702174
*/
2171-
if (HAS_RQ(my_qp) && !IS_SRQ(my_qp))
2175+
if (HAS_RQ(my_qp) && !IS_SRQ(my_qp) && !is_user)
21722176
del_from_err_list(my_qp->recv_cq, &my_qp->rq_err_node);
21732177

2174-
if (HAS_SQ(my_qp))
2178+
if (HAS_SQ(my_qp) && !is_user)
21752179
del_from_err_list(my_qp->send_cq, &my_qp->sq_err_node);
21762180

21772181
/* now wait until all pending events have completed */
@@ -2209,13 +2213,13 @@ static int internal_destroy_qp(struct ib_device *dev, struct ehca_qp *my_qp,
22092213

22102214
if (HAS_RQ(my_qp)) {
22112215
ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue);
2212-
2213-
vfree(my_qp->rq_map.map);
2216+
if (!is_user)
2217+
vfree(my_qp->rq_map.map);
22142218
}
22152219
if (HAS_SQ(my_qp)) {
22162220
ipz_queue_dtor(my_pd, &my_qp->ipz_squeue);
2217-
2218-
vfree(my_qp->sq_map.map);
2221+
if (!is_user)
2222+
vfree(my_qp->sq_map.map);
22192223
}
22202224
kmem_cache_free(qp_cache, my_qp);
22212225
atomic_dec(&shca->num_qps);

0 commit comments

Comments
 (0)