Received: by 10.192.165.148 with SMTP id m20csp1470543imm; Sat, 5 May 2018 12:55:55 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrSDRJGrBUMnVrSv+uE6xNhnJYNrBG48jrSie41NjOFkoMR9Hq4T3iqe7s0yYbs+m0sqNDX X-Received: by 2002:a17:902:b609:: with SMTP id b9-v6mr31985860pls.29.1525550155627; Sat, 05 May 2018 12:55:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525550155; cv=none; d=google.com; s=arc-20160816; b=VPeGKl7RHTm+7Ninr+h036hB+xNiIozphyy6J/LKffmJoubn0P/Eg9Snvh3Nyh0fkE JZkE8lmX79IHnoiAT5ejqzDIjEM2NggkE8goidIeAwlb6gHKcclD3VFIm5ooBlddDhnn K/aV7DMFEXvvLS/11D+jJeFDX+JF+VJg+hwJj3LPRAkOqq7Ke9oRSzpGbrSkMTJfB63j rCTPzcwfZqve2wphfDYE+0lKi3PqqXRIPWgHR0H/GXdFgNPqvN64BAGtkPT0aabVOx4G 5i97DL1lqtLUqpNYxnLvVttLTCMnhKP+UvagJXbn2Kf1C7SUVDRnfUuxk7YzzBLie+Gk n/xA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :arc-authentication-results; bh=FTKBJ/tCztddEWitJjggXr5zCd5fXQ0X+BF6agaMefY=; b=DcpyVUVF7Egrr0vGqqcVfR/YS8qyWe6lxkMAv4DB09k7hGk0YOi5qnS//Bt9iraTM9 8Wj1WeIqYZ3P3o4HAD1L9E0MyFnJKLVtdG70BOrZphnFN4iNlDl3/2raOQmTRCce0REX FHfrBybwGQvJOD+bnXolCOXUlz5XTyF20I6LEazDJrtBfWAB3Hp68BOahQ9PRsx9cOSe wZEF3APMisILi6Fg8AvSNTCOvv2kgn3uyZjGa5LWb9eF+I6rQUSCwMw/tFcE2pdHCsA2 kPYaV6UwzraZkOcHO6hwi59IsWaq+ebzOmSn7AsRdp95ctsowA7gmK3hq/0iTsHdVUWw x08Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t184si19198489pfb.98.2018.05.05.12.55.41; Sat, 05 May 2018 12:55:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751851AbeEETy6 (ORCPT + 99 others); Sat, 5 May 2018 15:54:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35544 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751709AbeEETy4 (ORCPT ); Sat, 5 May 2018 15:54:56 -0400 Received: from smtp.corp.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.26]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E7CB83188CD6; Sat, 5 May 2018 19:54:55 +0000 (UTC) Received: from cantor.redhat.com (ovpn-116-34.phx2.redhat.com [10.3.116.34]) by smtp.corp.redhat.com (Postfix) with ESMTP id 82D53309128B; Sat, 5 May 2018 19:54:55 +0000 (UTC) From: Jerry Snitselaar To: linux-integrity@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Jarkko Sakkinen , Peter Huewe , Jason Gunthorpe Subject: [PATCH] tpm_tis: verify locality released before returning from release_locality Date: Sat, 5 May 2018 12:54:53 -0700 Message-Id: <20180505195453.10431-1-jsnitsel@redhat.com> X-Scanned-By: MIMEDefang 2.84 on 10.5.11.26 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.41]); Sat, 05 May 2018 19:54:56 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For certain tpm chips releasing locality can take long enough that a subsequent call to request_locality will see the locality as being active when the access register is read in check_locality. So check that the locality has been released before returning from release_locality. Cc: Jarkko Sakkinen Cc: Peter Huewe Cc: Jason Gunthorpe Reported-by: Laurent Bigonville Signed-off-by: Jerry Snitselaar --- drivers/char/tpm/tpm_tis_core.c | 47 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c index 5a1f47b43947..d547cd309dbd 100644 --- a/drivers/char/tpm/tpm_tis_core.c +++ b/drivers/char/tpm/tpm_tis_core.c @@ -143,13 +143,58 @@ static bool check_locality(struct tpm_chip *chip, int l) return false; } +static bool locality_inactive(struct tpm_chip *chip, int l) +{ + struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); + int rc; + u8 access; + + rc = tpm_tis_read8(priv, TPM_ACCESS(l), &access); + if (rc < 0) + return false; + + if ((access & (TPM_ACCESS_VALID | TPM_ACCESS_ACTIVE_LOCALITY)) + == TPM_ACCESS_VALID) + return true; + + return false; +} + static int release_locality(struct tpm_chip *chip, int l) { struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); + unsigned long stop, timeout; + long rc; tpm_tis_write8(priv, TPM_ACCESS(l), TPM_ACCESS_ACTIVE_LOCALITY); - return 0; + stop = jiffies + chip->timeout_a; + + if (chip->flags & TPM_CHIP_FLAG_IRQ) { +again: + timeout = stop - jiffies; + if ((long)timeout <= 0) + return -1; + + rc = wait_event_interruptible_timeout(priv->int_queue, + (locality_inactive(chip, l)), + timeout); + + if (rc > 0) + return 0; + + if (rc == -ERESTARTSYS && freezing(current)) { + clear_thread_flag(TIF_SIGPENDING); + goto again; + } + } else { + do { + if (locality_inactive(chip, l)) + return 0; + tpm_msleep(TPM_TIMEOUT); + } while (time_before(jiffies, stop)); + } + return -1; } static int request_locality(struct tpm_chip *chip, int l) -- 2.15.0