IB/ehca: Discard double CQE for one WR
Under rare circumstances, the ehca hardware might erroneously generate two CQEs for the same WQE, which is not compliant to the IB spec and will cause unpredictable errors like memory being freed twice. To avoid this problem, the driver needs to detect the second CQE and discard it. For this purpose, introduce an array holding as many elements as the SQ of the QP, called sq_map. Each sq_map entry stores a "reported" flag for one WQE in the SQ. When a work request is posted to the SQ, the respective "reported" flag is set to zero. After the arrival of a CQE, the flag is set to 1, which allows to detect the occurence of a second CQE. The mapping between WQE / CQE and the corresponding sq_map element is implemented by replacing the lowest 16 Bits of the wr_id with the index in the queue map. The original 16 Bits are stored in the sq_map entry and are restored when the CQE is passed to the application. Signed-off-by: Alexander Schmidt <alexs@linux.vnet.ibm.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:

committed by
Roland Dreier

parent
129a10fb81
commit
6773f079b7
@@ -156,6 +156,14 @@ struct ehca_mod_qp_parm {
|
||||
|
||||
#define EHCA_MOD_QP_PARM_MAX 4
|
||||
|
||||
#define QMAP_IDX_MASK 0xFFFFULL
|
||||
|
||||
/* struct for tracking if cqes have been reported to the application */
|
||||
struct ehca_qmap_entry {
|
||||
u16 app_wr_id;
|
||||
u16 reported;
|
||||
};
|
||||
|
||||
struct ehca_qp {
|
||||
union {
|
||||
struct ib_qp ib_qp;
|
||||
@@ -165,6 +173,7 @@ struct ehca_qp {
|
||||
enum ehca_ext_qp_type ext_type;
|
||||
enum ib_qp_state state;
|
||||
struct ipz_queue ipz_squeue;
|
||||
struct ehca_qmap_entry *sq_map;
|
||||
struct ipz_queue ipz_rqueue;
|
||||
struct h_galpas galpas;
|
||||
u32 qkey;
|
||||
|
Reference in New Issue
Block a user