|
@@ -396,6 +396,7 @@ static int get_linkdowndefaultstate(struct qib_pportdata *ppd)
|
|
|
|
|
|
static int check_mkey(struct qib_ibport *ibp, struct ib_smp *smp, int mad_flags)
|
|
|
{
|
|
|
+ int valid_mkey = 0;
|
|
|
int ret = 0;
|
|
|
|
|
|
/* Is the mkey in the process of expiring? */
|
|
@@ -406,23 +407,36 @@ static int check_mkey(struct qib_ibport *ibp, struct ib_smp *smp, int mad_flags)
|
|
|
ibp->mkeyprot = 0;
|
|
|
}
|
|
|
|
|
|
- /* M_Key checking depends on Portinfo:M_Key_protect_bits */
|
|
|
- if ((mad_flags & IB_MAD_IGNORE_MKEY) == 0 && ibp->mkey != 0 &&
|
|
|
- ibp->mkey != smp->mkey &&
|
|
|
- (smp->method == IB_MGMT_METHOD_SET ||
|
|
|
- smp->method == IB_MGMT_METHOD_TRAP_REPRESS ||
|
|
|
- (smp->method == IB_MGMT_METHOD_GET && ibp->mkeyprot >= 2))) {
|
|
|
- if (ibp->mkey_violations != 0xFFFF)
|
|
|
- ++ibp->mkey_violations;
|
|
|
- if (!ibp->mkey_lease_timeout && ibp->mkey_lease_period)
|
|
|
- ibp->mkey_lease_timeout = jiffies +
|
|
|
- ibp->mkey_lease_period * HZ;
|
|
|
- /* Generate a trap notice. */
|
|
|
- qib_bad_mkey(ibp, smp);
|
|
|
- ret = IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED;
|
|
|
- } else if (ibp->mkey_lease_timeout)
|
|
|
+ if ((mad_flags & IB_MAD_IGNORE_MKEY) || ibp->mkey == 0 ||
|
|
|
+ ibp->mkey == smp->mkey)
|
|
|
+ valid_mkey = 1;
|
|
|
+
|
|
|
+ /* Unset lease timeout on any valid Get/Set/TrapRepress */
|
|
|
+ if (valid_mkey && ibp->mkey_lease_timeout &&
|
|
|
+ (smp->method == IB_MGMT_METHOD_GET ||
|
|
|
+ smp->method == IB_MGMT_METHOD_SET ||
|
|
|
+ smp->method == IB_MGMT_METHOD_TRAP_REPRESS))
|
|
|
ibp->mkey_lease_timeout = 0;
|
|
|
|
|
|
+ if (!valid_mkey) {
|
|
|
+ switch (smp->method) {
|
|
|
+ case IB_MGMT_METHOD_GET:
|
|
|
+ /* Bad mkey not a violation below level 2 */
|
|
|
+ if (ibp->mkeyprot < 2)
|
|
|
+ break;
|
|
|
+ case IB_MGMT_METHOD_SET:
|
|
|
+ case IB_MGMT_METHOD_TRAP_REPRESS:
|
|
|
+ if (ibp->mkey_violations != 0xFFFF)
|
|
|
+ ++ibp->mkey_violations;
|
|
|
+ if (!ibp->mkey_lease_timeout && ibp->mkey_lease_period)
|
|
|
+ ibp->mkey_lease_timeout = jiffies +
|
|
|
+ ibp->mkey_lease_period * HZ;
|
|
|
+ /* Generate a trap notice. */
|
|
|
+ qib_bad_mkey(ibp, smp);
|
|
|
+ ret = IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|