Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp4176863imm; Mon, 14 May 2018 03:53:13 -0700 (PDT) X-Google-Smtp-Source: AB8JxZo417GZy/uvV8/61ZWkk9j2sdJge8zQFMC5B9+Ek8dvCdCJlhS7jWdOGO5c4vsJoosGb5sC X-Received: by 2002:a17:902:9303:: with SMTP id bc3-v6mr9328549plb.18.1526295192961; Mon, 14 May 2018 03:53:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526295192; cv=none; d=google.com; s=arc-20160816; b=s5cZ31VljjEU85/uYLcjdSgcqV5hNScjFnYqsxhfKK95rHj8y6agYM77CQeynjj3bT fL0LOLyHYfcNyj2un8iTW9XnNPkx6qh2SOV1p1hxmVjb4E44EAmwWMMsSyQTjacwd6Ic 6iclvLARBwJcYtngYKy9Zz2EgzRrUJZyGAXyeoaeLicJk/+4HMA2SHEZjchC/OFdHxdw m0pVsLtHNHlpOdYZ5tP/onZc93DQ1r6LsQ+PTB1nutKuzwrXUSjv9tYRTOt2orupMXDP bgkC0n2tcmS9pLb4Sg5tx9tfTzDLTxiyFLTV/JnVQ0muNozp+VsL4Sb2iNcUsobSPBHa HwfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:organization:in-reply-to :content-transfer-encoding:content-disposition:mime-version :references:message-id:subject:cc:to:from:date :arc-authentication-results; bh=/3SbTRDHy6iLYLwDMwpRpERUYluzMapLBQMayZ8hmPA=; b=HFQg3Wu3jqV802taCWziFHHcFGpNiBxwjiUJYi0yi+iCoUFx8LEzJ78cNrKfGmNEyb vUNa/nxqG4y116P/H6XVnTcxUtBTLOQ4pTf4+oyPVuPBgKZxhOl2wnp2kqSrB3cPEBJr Y4I4EtHTpuxrB+tAnmPF4A+qTuJUThR5FWQx+GCcMjjFkPMcptqWDNr8rYsUFf0cpcfI xOX3Rkr5ce/1jncFOozmASFKD6TrlcJgRQLnI6s0uVbW7UIJTw2gcgtyviJnD8ZshiDh M2Z5bBa4wDVuGadrKpj/71g6DeAyFUu5PAmUXEfElyHhfzee44wSTwCGl/l/14dGT0Ej cs1w== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w127-v6si9286255pfd.313.2018.05.14.03.52.58; Mon, 14 May 2018 03:53:12 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752358AbeENKwq (ORCPT + 99 others); Mon, 14 May 2018 06:52:46 -0400 Received: from mga18.intel.com ([134.134.136.126]:30946 "EHLO mga18.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752246AbeENKwn (ORCPT ); Mon, 14 May 2018 06:52:43 -0400 X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 May 2018 03:52:42 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,399,1520924400"; d="scan'208";a="228348747" Received: from yixuanma-mobl.ccr.corp.intel.com (HELO localhost) ([10.249.254.136]) by fmsmga006.fm.intel.com with ESMTP; 14 May 2018 03:52:38 -0700 Date: Mon, 14 May 2018 13:52:37 +0300 From: Jarkko Sakkinen To: Nayna Jain Cc: linux-integrity@vger.kernel.org, zohar@linux.vnet.ibm.com, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, peterhuewe@gmx.de, tpmdd@selhorst.net, jgunthorpe@obsidianresearch.com, patrickc@us.ibm.com Subject: Re: [PATCH v3 2/2] tpm: reduce polling time to usecs for even finer granularity Message-ID: <20180514105237.GE8228@linux.intel.com> References: <20180507160733.8817-1-nayna@linux.vnet.ibm.com> <20180507160733.8817-3-nayna@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180507160733.8817-3-nayna@linux.vnet.ibm.com> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, May 07, 2018 at 12:07:33PM -0400, Nayna Jain wrote: > The TPM burstcount and status commands are supposed to return very > quickly [2][3]. This patch further reduces the TPM poll sleep time to usecs > in get_burstcount() and wait_for_tpm_stat() by calling usleep_range() > directly. > > After this change, performance on a system[1] with a TPM 1.2 with an 8 byte > burstcount for 1000 extends improved from ~10.7 sec to ~7 sec. > > [1] All tests are performed on an x86 based, locked down, single purpose > closed system. It has Infineon TPM 1.2 using LPC Bus. > > [2] From the TCG Specification "TCG PC Client Specific TPM Interface > Specification (TIS), Family 1.2": > > "NOTE : It takes roughly 330 ns per byte transfer on LPC. 256 bytes would > take 84 us, which is a long time to stall the CPU. Chipsets may not be > designed to post this much data to LPC; therefore, the CPU itself is > stalled for much of this time. Sending 1 kB would take 350 μs. Therefore, > even if the TPM_STS_x.burstCount field is a high value, software SHOULD > be interruptible during this period." > > [3] From the TCG Specification 2.0, "TCG PC Client Platform TPM Profile > (PTP) Specification": > > "It takes roughly 330 ns per byte transfer on LPC. 256 bytes would take > 84 us. Chipsets may not be designed to post this much data to LPC; > therefore, the CPU itself is stalled for much of this time. Sending 1 kB > would take 350 us. Therefore, even if the TPM_STS_x.burstCount field is a > high value, software should be interruptible during this period. For SPI, > assuming 20MHz clock and 64-byte transfers, it would take about 120 usec > to move 256B of data. Sending 1kB would take about 500 usec. If the > transactions are done using 4 bytes at a time, then it would take about > 1 msec. to transfer 1kB of data." > > Signed-off-by: Nayna Jain > Reviewed-by: Mimi Zohar > Reviewed-by: Jarkko Sakkinen > --- > drivers/char/tpm/tpm.h | 4 +++- > drivers/char/tpm/tpm_tis_core.c | 5 +++-- > 2 files changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h > index ca05828b6981..9824cccb2c76 100644 > --- a/drivers/char/tpm/tpm.h > +++ b/drivers/char/tpm/tpm.h > @@ -54,7 +54,9 @@ enum tpm_timeout { > TPM_TIMEOUT = 5, /* msecs */ > TPM_TIMEOUT_RETRY = 100, /* msecs */ > TPM_TIMEOUT_RANGE_US = 300, /* usecs */ > - TPM_TIMEOUT_POLL = 1 /* msecs */ > + TPM_TIMEOUT_POLL = 1, /* msecs */ > + TPM_TIMEOUT_USECS_MIN = 100, /* usecs */ > + TPM_TIMEOUT_USECS_MAX = 500 /* usecs */ > }; > > /* TPM addresses */ > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > index 493401f5fd39..b77a8dcfb822 100644 > --- a/drivers/char/tpm/tpm_tis_core.c > +++ b/drivers/char/tpm/tpm_tis_core.c > @@ -84,7 +84,8 @@ static int wait_for_tpm_stat(struct tpm_chip *chip, u8 mask, > } > } else { > do { > - tpm_msleep(TPM_TIMEOUT_POLL); > + usleep_range(TPM_TIMEOUT_USECS_MIN, > + TPM_TIMEOUT_USECS_MAX); This is not properly aligned and it split is into two lines for no good reason. > status = chip->ops->status(chip); > if ((status & mask) == mask) > return 0; > @@ -228,7 +229,7 @@ static int get_burstcount(struct tpm_chip *chip) > burstcnt = (value >> 8) & 0xFFFF; > if (burstcnt) > return burstcnt; > - tpm_msleep(TPM_TIMEOUT_POLL); > + usleep_range(TPM_TIMEOUT_USECS_MIN, TPM_TIMEOUT_USECS_MAX); And it is incosistent with this in terms how the code is laid out... /Jarkko