IB/rxe: Clear queue buffer when modifying QP to reset
RXE resets the send-q only once in rxe_qp_init_req() when
QP is created, but when the QP is reused after QP reset, the send-q
holds previous garbage data.
This garbage data wrongly fails CQEs that otherwise
should have completed successfully.
Fixes: 8700e3e7c4
("Soft RoCE driver")
Signed-off-by: Yonatan Cohen <yonatanc@mellanox.com>
Reviewed-by: Moni Shoua <monis@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
002e062e13
commit
aa75b07b47
|
@ -522,6 +522,7 @@ static void rxe_qp_reset(struct rxe_qp *qp)
|
|||
if (qp->sq.queue) {
|
||||
__rxe_do_task(&qp->comp.task);
|
||||
__rxe_do_task(&qp->req.task);
|
||||
rxe_queue_reset(qp->sq.queue);
|
||||
}
|
||||
|
||||
/* cleanup attributes */
|
||||
|
|
|
@ -84,6 +84,15 @@ err1:
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
inline void rxe_queue_reset(struct rxe_queue *q)
|
||||
{
|
||||
/* queue is comprised from header and the memory
|
||||
* of the actual queue. See "struct rxe_queue_buf" in rxe_queue.h
|
||||
* reset only the queue itself and not the management header
|
||||
*/
|
||||
memset(q->buf->data, 0, q->buf_size - sizeof(struct rxe_queue_buf));
|
||||
}
|
||||
|
||||
struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe,
|
||||
int *num_elem,
|
||||
unsigned int elem_size)
|
||||
|
|
|
@ -84,6 +84,8 @@ int do_mmap_info(struct rxe_dev *rxe,
|
|||
size_t buf_size,
|
||||
struct rxe_mmap_info **ip_p);
|
||||
|
||||
void rxe_queue_reset(struct rxe_queue *q);
|
||||
|
||||
struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe,
|
||||
int *num_elem,
|
||||
unsigned int elem_size);
|
||||
|
|
Loading…
Reference in a new issue