mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
IB/hfi1: Fix context recovery when PBC has an UnsupportedVL
commitd623500b3cupstream. If a packet stream uses an UnsupportedVL (virtual lane), the send engine will not send the packet, and it will not indicate that an error has occurred. This will cause the packet stream to block. HFI has 8 virtual lanes available for packet streams. Each lane can be enabled or disabled using the UnsupportedVL mask. If a lane is disabled, adding a packet to the send context must be disallowed. The current mask for determining unsupported VLs defaults to 0 (allow all). This is incorrect. Only the VLs that are defined should be allowed. Determine which VLs are disabled (mtu == 0), and set the appropriate unsupported bit in the mask. The correct mask will allow the send engine to error on the invalid VL, and error recovery will work correctly. Cc: <stable@vger.kernel.org> # 4.9.x+ Fixes:7724105686("IB/hfi1: add driver files") Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Reviewed-by: Lukasz Odzioba <lukasz.odzioba@intel.com> Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
412a4b4db1
commit
693536a7ce
@@ -86,6 +86,7 @@ void pio_send_control(struct hfi1_devdata *dd, int op)
|
||||
unsigned long flags;
|
||||
int write = 1; /* write sendctrl back */
|
||||
int flush = 0; /* re-read sendctrl to make sure it is flushed */
|
||||
int i;
|
||||
|
||||
spin_lock_irqsave(&dd->sendctrl_lock, flags);
|
||||
|
||||
@@ -95,9 +96,13 @@ void pio_send_control(struct hfi1_devdata *dd, int op)
|
||||
reg |= SEND_CTRL_SEND_ENABLE_SMASK;
|
||||
/* Fall through */
|
||||
case PSC_DATA_VL_ENABLE:
|
||||
mask = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(dd->vld); i++)
|
||||
if (!dd->vld[i].mtu)
|
||||
mask |= BIT_ULL(i);
|
||||
/* Disallow sending on VLs not enabled */
|
||||
mask = (((~0ull) << num_vls) & SEND_CTRL_UNSUPPORTED_VL_MASK) <<
|
||||
SEND_CTRL_UNSUPPORTED_VL_SHIFT;
|
||||
mask = (mask & SEND_CTRL_UNSUPPORTED_VL_MASK) <<
|
||||
SEND_CTRL_UNSUPPORTED_VL_SHIFT;
|
||||
reg = (reg & ~SEND_CTRL_UNSUPPORTED_VL_SMASK) | mask;
|
||||
break;
|
||||
case PSC_GLOBAL_DISABLE:
|
||||
|
||||
Reference in New Issue
Block a user