On Tue, Dec 19, 2023 at 09:23:11AM +0200, Sergey Gorenko wrote: > The iser_reg_resources structure has two pointers to MR but only one > mr_valid field. The implementation assumes that we use only *sig_mr when > pi_enable is true. Otherwise, we use only *mr. However, it is only > sometimes correct. Read commands without protection information occur > even when pi_enble is true. For example, the following SCSI commands > have a Data-In buffer but never have protection information: READ > CAPACITY (16), INQUIRY, MODE SENSE(6), MAINTENANCE IN. So, we use > *sig_mr for some SCSI commands and *mr for the other SCSI commands. > > In most cases, it works fine because the remote invalidation is applied. > However, there are two cases when the remote invalidation is not > applicable. > 1. Small write commands when all data is sent as an immediate. > 2. The target does not support the remote invalidation feature. > > The lazy invalidation is used if the remote invalidation is impossible. > Since, at the lazy invalidation, we always invalidate the MR we want to > use, the wrong MR may be invalidated. > > To fix the issue, we need a field per MR that indicates the MR needs > invalidation. Since the ib_mr structure already has such a field, let's > use ib_mr.need_inval instead of iser_reg_resources.mr_valid. > > Fixes: b76a439982f8 ("IB/iser: Use IB_WR_REG_MR_INTEGRITY for PI handover") > Acked-by: Max Gurtovoy <mgurtovoy@xxxxxxxxxx> > Signed-off-by: Sergey Gorenko <sergeygo@xxxxxxxxxx> > --- > drivers/infiniband/ulp/iser/iscsi_iser.h | 2 -- > drivers/infiniband/ulp/iser/iser_initiator.c | 5 ++++- > drivers/infiniband/ulp/iser/iser_memory.c | 8 ++++---- > drivers/infiniband/ulp/iser/iser_verbs.c | 1 - > 4 files changed, 8 insertions(+), 8 deletions(-) Applied to for-next, thanks Jason