From nobody Wed Jan 26 02:16:11 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 546E6198CD03; Wed, 26 Jan 2022 02:16:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Jk6lc1nDCz4r2G; Wed, 26 Jan 2022 02:16:12 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1643163372; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cdAp6EPZJCSgCMUEApGYoeXGKfHSaaUoby0p8CiEDJ8=; b=PyO0ZyYMQP4EkoN+n+F+od4na40AquZFCQn0aZOHHyFGwr85riJf2Nju74LIpVNq4yn/Gl snEKfqgyLkUF9eamtashO3Nzeg6ULgVU+TQ9aHG6W9/bA1bmfIWFStWNOFIqUXTPFrEOME XoB4JUPrgVkFWO9fNoAWa9ZGFd8N4A6I2G4kNGlWPJb+XUcxyzz7thgGIjffHDRpfbsmcO BhiZJmAO3ezS/cB44K3tHwXcGnT1PCEkNekfimO6E+jiUB2WJCFqiE/ySkbFDBNi18enEy XoMnlgiWIQ3kZYNqUisHcQVdmz6hyCZTuclGrkhvaDMWz7hBVGfzYNgji8Cf7A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 166F2151A3; Wed, 26 Jan 2022 02:16:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20Q2GB7c033629; Wed, 26 Jan 2022 02:16:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20Q2GBoI033628; Wed, 26 Jan 2022 02:16:11 GMT (envelope-from git) Date: Wed, 26 Jan 2022 02:16:11 GMT Message-Id: <202201260216.20Q2GBoI033628@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: e35816c1c909 - main - mpr/mps: Fix a race in diagnostic reset List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: e35816c1c9094804f5a4b5f7b34f920f78cff5bd Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1643163372; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=cdAp6EPZJCSgCMUEApGYoeXGKfHSaaUoby0p8CiEDJ8=; b=Y/6JmtyF6jPUPgBalpaqtvs1cXMA2hOPXOKzmnykWl44dwjQ3+qxCEMlgjIzOvWplNlJFm 0VJXdv/Y2ZKsTrtgEB9+glsUJjeGJd2Q6Pg4Z1hqnfNhK1vQIe+YQr/MRVXFBPXRN3IozC xY1b3tfEzB4vbmOKQyUQm7Ws6SC9Zy3u3oW5vN53qgpU1z8KzZThvIAPaXihoesoLbSB1u DGmDj4sDsCIf4LgJGDZVfqvz772zZTbOLS+eAgRs0qCjc+0wIkV3VlxHOrjq1BTuPw2mmy iArmqAiuSGBUi7ZaVkSquPxelQEehFrGUjXPoz0Pw8GjMR9na0UmTWDIfP8Whg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1643163372; a=rsa-sha256; cv=none; b=grym+vZLoaHd4Owlnm1bKZgDJqzb89mGNpyyq0/91dMMatOTmOquJBSK0rtT6cENhIFOOT RTt7d1mj/sva4w6ENhol8qQzl6HiD03sPia2lpCKHczwGoKIPoJWY3EPtWkUXftqs1c+fh ioh8Nxmrldg3A7RhiOIqviZWNlI7InffQRQYcZQ361Wq0rvwT2O2rB8ox8sHoY9rHJENwz HumYiCdBuJTq2gxyPJZMW69hCqtzKI+TmjWKCpCdpp3U/1RNTdSvo/Uzh1YsuTigEXsy9j YRvF+6xczg16mmhHmq6rhW4QCminfE9Khv659DVeCSZlQOKdRUqpUuzL12s9Dw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=e35816c1c9094804f5a4b5f7b34f920f78cff5bd commit e35816c1c9094804f5a4b5f7b34f920f78cff5bd Author: Warner Losh AuthorDate: 2022-01-25 23:23:03 +0000 Commit: Warner Losh CommitDate: 2022-01-26 02:15:46 +0000 mpr/mps: Fix a race in diagnostic reset There's a small race in freezing the simq when performing a diagnostic reset. During this time, a transaction can slip through and encounter the target id of 0. If we're still in diagnostic reset when we detect this, return a CAM_DEVICE_NOT_THERE status. Instead, freeze the queue and return a requeue status, similar to what we do when we're resetting a target and a transaction get here. The race is unavoidable due to separate locks for queue and SIM, but easy enough to detect and make harmless. Sponsored by: Netflix Reviewed by: scottl, mav Differential Revision: https://reviews.freebsd.org/D34017 --- sys/dev/mpr/mpr_sas.c | 9 +++++++++ sys/dev/mps/mps_sas.c | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/sys/dev/mpr/mpr_sas.c b/sys/dev/mpr/mpr_sas.c index 4a8dccb18538..d40900e03108 100644 --- a/sys/dev/mpr/mpr_sas.c +++ b/sys/dev/mpr/mpr_sas.c @@ -1864,6 +1864,15 @@ mprsas_action_scsiio(struct mprsas_softc *sassc, union ccb *ccb) targ = &sassc->targets[csio->ccb_h.target_id]; mpr_dprint(sc, MPR_TRACE, "ccb %p target flag %x\n", ccb, targ->flags); if (targ->handle == 0x0) { + if (targ->flags & MPRSAS_TARGET_INDIAGRESET) { + mpr_dprint(sc, MPR_ERROR, + "%s NULL handle for target %u in diag reset freezing queue\n", + __func__, csio->ccb_h.target_id); + ccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_DEV_QFRZN; + xpt_freeze_devq(ccb->ccb_h.path, 1); + xpt_done(ccb); + return; + } mpr_dprint(sc, MPR_ERROR, "%s NULL handle for target %u\n", __func__, csio->ccb_h.target_id); mprsas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE); diff --git a/sys/dev/mps/mps_sas.c b/sys/dev/mps/mps_sas.c index e55c4978208a..087988bedc6a 100644 --- a/sys/dev/mps/mps_sas.c +++ b/sys/dev/mps/mps_sas.c @@ -1637,6 +1637,15 @@ mpssas_action_scsiio(struct mpssas_softc *sassc, union ccb *ccb) targ = &sassc->targets[csio->ccb_h.target_id]; mps_dprint(sc, MPS_TRACE, "ccb %p target flag %x\n", ccb, targ->flags); if (targ->handle == 0x0) { + if (targ->flags & MPSSAS_TARGET_INDIAGRESET) { + mps_dprint(sc, MPS_ERROR, + "%s NULL handle for target %u in diag reset freezing queue\n", + __func__, csio->ccb_h.target_id); + ccb->ccb_h.status = CAM_REQUEUE_REQ | CAM_DEV_QFRZN; + xpt_freeze_devq(ccb->ccb_h.path, 1); + xpt_done(ccb); + return; + } mps_dprint(sc, MPS_ERROR, "%s NULL handle for target %u\n", __func__, csio->ccb_h.target_id); mpssas_set_ccbstatus(ccb, CAM_DEV_NOT_THERE);