Received: by 10.192.165.156 with SMTP id m28csp41222imm; Tue, 17 Apr 2018 06:16:15 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/JIHietp3I24DorhKb0qiQWhWXSP/8EleyfPWY88fsbIWF9LjGWXw51M45O+smdPBY4FZJ X-Received: by 2002:a17:902:8b84:: with SMTP id ay4-v6mr2011197plb.57.1523970975144; Tue, 17 Apr 2018 06:16:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523970975; cv=none; d=google.com; s=arc-20160816; b=A8/JOsGHe4DhDp7p84BNBPqqIikyZFehMwN3QhFOiZN4X+jXmnv+PeBh1zLyqPIPgn X7nfF14If+88KaGi01WYTKbRLK0CPZ5LFtwUFCkYS1kIXrFKFimOfrs6qzlnqd/VSs7n t2IC8nDU51InHTyEPuP8GlL69PzUWA04r0p/NvIZAKUezlBl0p9JOL/lwDyz8uHGcs+Z EyHw0Can2TibsXgtzfCGvJBnQ2lTMfYtcoqelBoCgu4ozeYBNH11xaq8hF2BsuGm3l5t N947Z2Vv4wSXu8guhFrWJ1SI8n4h3hv1CXPLMdapCYnWlfcOMHRkNuQ3PvonUDV4e3Pl GYbw== 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=c6Xb8plfA19YBV0fLgiXtp+GdpJjpuAfe0tP0tL1WqM=; b=YzcgkSAVw1/HA3Lan45Qs3jp0WLbrft0HMpyQt/Y2ljuIGjg8AglvKB+h2k1M15Ein G2bc+Z1KvLGI3K2hBfzrkNp9G/FVcTSOVvh7KNU0mupCffPies58u8AwKzl7/vhvQOfY 9FgBQGO1DSsssRYjwBOiDrPpojVOjxzMqqX9YHIOWTdoIAMamOn3OuZvfs0NfXT7RBh9 OEknfwa1lFPHXM7asYuM8e14bC3o67exo2A6iIk+9opga8WIXw3W+75HIjpVkMyHtStP vsXn8KIYcKc00nHChJ6miWRw29sqLoOAzjE7ZBGDuA9flEMQ3qsFq7/TNsmu1xsTZx95 2b1g== 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 p16si11738039pgc.241.2018.04.17.06.16.00; Tue, 17 Apr 2018 06:16:15 -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 S1753780AbeDQNNQ (ORCPT + 99 others); Tue, 17 Apr 2018 09:13:16 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:53038 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753224AbeDQNNN (ORCPT ); Tue, 17 Apr 2018 09:13:13 -0400 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id w3HDCi0K022942 for ; Tue, 17 Apr 2018 09:13:13 -0400 Received: from e06smtp13.uk.ibm.com (e06smtp13.uk.ibm.com [195.75.94.109]) by mx0a-001b2d01.pphosted.com with ESMTP id 2hdevbqk1k-1 (version=TLSv1.2 cipher=AES256-SHA256 bits=256 verify=NOT) for ; Tue, 17 Apr 2018 09:13:12 -0400 Received: from localhost by e06smtp13.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 17 Apr 2018 14:13:02 +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; Tue, 17 Apr 2018 14:12:59 +0100 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id w3HDCwMw3670278; Tue, 17 Apr 2018 13:12:58 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ABB40A4069; Tue, 17 Apr 2018 14:05:07 +0100 (BST) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 96AE6A404D; Tue, 17 Apr 2018 14:05:06 +0100 (BST) Received: from localhost.endicott.ibm.com (unknown [9.60.15.245]) by d06av23.portsmouth.uk.ibm.com (Postfix) with ESMTP; Tue, 17 Apr 2018 14:05:06 +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 v2 2/2] tpm: reduce polling time to usecs for even finer granularity Date: Tue, 17 Apr 2018 09:12:46 -0400 X-Mailer: git-send-email 2.13.3 In-Reply-To: <20180417131246.434-1-nayna@linux.vnet.ibm.com> References: <20180417131246.434-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: 18041713-0012-0000-0000-000005CBD4FD X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18041713-0013-0000-0000-000019481FCD Message-Id: <20180417131246.434-3-nayna@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-04-17_07:,, 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-1804170119 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 [1][2]. 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 TPM 1.2 with an 8 byte burstcount for 1000 extends improved from ~10.7 sec to ~7 sec. [1] From 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." [2] From 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 --- 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..5bba5c662423 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