Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1555740imm; Tue, 15 May 2018 22:52:20 -0700 (PDT) X-Google-Smtp-Source: AB8JxZp9rok8ImttcIOr5z+KM3pDfVKtseSycoCgGgU1A985bK5EZEUXjBOyAf5CMhE1v6lMHOG6 X-Received: by 2002:a65:5105:: with SMTP id f5-v6mr11092115pgq.232.1526449940512; Tue, 15 May 2018 22:52:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526449940; cv=none; d=google.com; s=arc-20160816; b=0CSizm5twZjdd/LH4+vTY89JjP9Mm32zmmHQrWmm6dqx28mtFCelOdxl+N34WFwydu YqjTq3556SYIlUVxFK2spbpwOjzYGwcerAGgLUgDrXconftJoRzRhsAXg3y9RDC2jxiO VPoE9/FNMmOdQ/j86/jdky/Bz4mhRRDS1ZCdQ8MLc6C99VgeTLisQFsb3xe9AJfB3vE+ e5FfoW3zvtcI2fO9GjNtuxI42SPWVOnnsG7arTBQiQ8lRglvRjOxdsvartQlhIPrbfGm BL0gnXSJvPPrFO5sibtEvP6Hke+gFRDrx1RVa4yDi8vGld3kiwZGHU3uA8R8i9ZDM/oY lhag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:content-transfer-encoding :mime-version:references:in-reply-to:date:subject:cc:to:from :arc-authentication-results; bh=sCVpqCy9tol08Iy4ruFd8f0w66vNzRzKdt9Oc14WMRY=; b=FP4gNphIL7QVxvfsAejRUCafqLGJZPI6/QK6R8uRvxT8Pxp3OxCXeXi3g5ZX7fMCzf 7SHdbfM0w9ysw5Qi55ezBi6DWqCHAGfKuuXJmRxkk5TxyrnELxKz07gLkmFP1f3Um4o2 X6Mj7Ildn0ONifM8NImHX9bKLSkuWttDlb2xnUGJbau0ZFWQTjrYG29IF83Muslj5o6w A8ZDp4H2Esd+jPvhTDYDQWrzdAtyJIEMznqxO62aa4oZkwjuSKdQzxe3zDLOZgTFzV46 A1QjgV9N5OiEEwib8zzlf0wJ/mayRAmKn52MmFqa6MLr3qtPegugTDyVwU32aETgDHkm U5Yg== 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=ibm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i67-v6si1916057pfi.95.2018.05.15.22.52.06; Tue, 15 May 2018 22:52:20 -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=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752642AbeEPFv6 (ORCPT + 99 others); Wed, 16 May 2018 01:51:58 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:54142 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752211AbeEPFvz (ORCPT ); Wed, 16 May 2018 01:51:55 -0400 Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w4G5ni7B049004 for ; Wed, 16 May 2018 01:51:55 -0400 Received: from e06smtp13.uk.ibm.com (e06smtp13.uk.ibm.com [195.75.94.109]) by mx0b-001b2d01.pphosted.com with ESMTP id 2j0cebcxhb-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 16 May 2018 01:51:54 -0400 Received: from localhost by e06smtp13.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 16 May 2018 06:51:53 +0100 Received: from b06cxnps3074.portsmouth.uk.ibm.com (9.149.109.194) by e06smtp13.uk.ibm.com (192.168.101.143) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Wed, 16 May 2018 06:51:49 +0100 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w4G5pmv212255552; Wed, 16 May 2018 05:51:48 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 161654C052; Wed, 16 May 2018 06:43:39 +0100 (BST) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9CCC44C058; Wed, 16 May 2018 06:43:37 +0100 (BST) Received: from localhost.endicott.ibm.com (unknown [9.60.15.245]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 16 May 2018 06:43:37 +0100 (BST) From: Nayna Jain To: linux-integrity@vger.kernel.org Cc: zohar@linux.vnet.ibm.com, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, peterhuewe@gmx.de, jarkko.sakkinen@linux.intel.com, tpmdd@selhorst.net, jgunthorpe@obsidianresearch.com, patrickc@us.ibm.com, Nayna Jain Subject: [PATCH v4 2/2] tpm: reduce polling time to usecs for even finer granularity Date: Wed, 16 May 2018 01:51:25 -0400 X-Mailer: git-send-email 2.13.3 In-Reply-To: <20180516055125.5685-1-nayna@linux.vnet.ibm.com> References: <20180516055125.5685-1-nayna@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 18051605-0012-0000-0000-000005D704B0 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18051605-0013-0000-0000-00001954267F Message-Id: <20180516055125.5685-3-nayna@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-05-16_02:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=1 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1709140000 definitions=main-1805160059 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 Acked-by: Jay Freyensee --- 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 7e797377e1eb..f0e4d290c347 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 021e6b68f2db..bbd8eed30e57 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); status = chip->ops->status(chip); if ((status & mask) == mask) return 0; @@ -226,7 +227,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); } while (time_before(jiffies, stop)); return -EBUSY; } -- 2.13.3