Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754230AbdIFM7A (ORCPT ); Wed, 6 Sep 2017 08:59:00 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:41617 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754409AbdIFM6s (ORCPT ); Wed, 6 Sep 2017 08:58:48 -0400 Subject: Re: [PATCH 1/4] tpm: ignore burstcount to improve tpm_tis send() performance. To: tpmdd-devel@lists.sourceforge.net References: <20170906125643.5070-1-nayna@linux.vnet.ibm.com> <20170906125643.5070-6-nayna@linux.vnet.ibm.com> Cc: peterhuewe@gmx.de, tpmdd@selhorst.net, jarkko.sakkinen@linux.intel.com, jgunthorpe@obsidianresearch.com, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ima-devel@lists.sourceforge.net, patrickc@us.ibm.com From: Nayna Date: Wed, 6 Sep 2017 18:28:38 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.6.0 MIME-Version: 1.0 In-Reply-To: <20170906125643.5070-6-nayna@linux.vnet.ibm.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit X-TM-AS-GCONF: 00 x-cbid: 17090612-0016-0000-0000-000007793E9C X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00007677; HX=3.00000241; KW=3.00000007; PH=3.00000004; SC=3.00000226; SDB=6.00913077; UDB=6.00458235; IPR=6.00693339; BA=6.00005574; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00017032; XFM=3.00000015; UTC=2017-09-06 12:58:45 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17090612-0017-0000-0000-00003B5B2D71 Message-Id: <59AFF0FE.5080500@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-09-06_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1707230000 definitions=main-1709060179 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4251 Lines: 112 Please ignore these one.. My command took patches recursively from directory also. Sorry for this. Thanks & Regards, - Nayna On 09/06/2017 06:26 PM, Nayna Jain wrote: > The TPM burstcount status indicates the number of bytes that can > be sent to the TPM without causing bus wait states. Effectively, > it is the number of empty bytes in the command FIFO. Further, > some TPMs have a static burstcount, when the value remains zero > until the entire FIFO is empty. > > This patch adds an optimization to check for burstcount only once. > And if it is valid, it writes all the bytes at once, permitting > wait states. The performance of a 34 byte extend on a TPM 1.2 with > an 8 byte burstcount improved from 41 msec to 14 msec. > > This functionality is enabled only by passing module > parameter ignore_burst_count=1. By default, this parameter > is disabled. > > Suggested-by: Ken Goldman in > conjunction with the TPM Device Driver work group. > Signed-off-by: Nayna Jain > Acked-by: Mimi Zohar > --- > Documentation/admin-guide/kernel-parameters.txt | 8 ++++++++ > drivers/char/tpm/tpm_tis_core.c | 24 +++++++++++++++++++++--- > 2 files changed, 29 insertions(+), 3 deletions(-) > > diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt > index 4e303be83df6..3c59bb91e1ee 100644 > --- a/Documentation/admin-guide/kernel-parameters.txt > +++ b/Documentation/admin-guide/kernel-parameters.txt > @@ -1465,6 +1465,14 @@ > mode generally follows that for the NaN encoding, > except where unsupported by hardware. > > + ignore_burst_count [TPM_TIS_CORE] > + tpm_tis_core driver queries for the burstcount before > + every send call in a loop. However, it causes delay to > + the send command for TPMs with low burstcount value. > + Setting this value to 1, will make driver to query for > + burstcount only once in the loop to improve the > + performance. By default, its value is set to 0. > + > ignore_loglevel [KNL] > Ignore loglevel setting - this will print /all/ > kernel messages to the console. Useful for debugging. > diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c > index 63bc6c3b949e..6b9bf4c4d434 100644 > --- a/drivers/char/tpm/tpm_tis_core.c > +++ b/drivers/char/tpm/tpm_tis_core.c > @@ -31,6 +31,11 @@ > #include "tpm.h" > #include "tpm_tis_core.h" > > +static bool ignore_burst_count = false; > +module_param(ignore_burst_count, bool, 0444); > +MODULE_PARM_DESC(ignore_burst_count, > + "Ignore burstcount value while writing data"); > + > /* Before we attempt to access the TPM we must see that the valid bit is set. > * The specification says that this bit is 0 at reset and remains 0 until the > * 'TPM has gone through its self test and initialization and has established > @@ -256,6 +261,7 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) > { > struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev); > int rc, status, burstcnt; > + int sendcnt; > size_t count = 0; > bool itpm = priv->flags & TPM_TIS_ITPM_WORKAROUND; > > @@ -271,19 +277,31 @@ static int tpm_tis_send_data(struct tpm_chip *chip, u8 *buf, size_t len) > } > > while (count < len - 1) { > + > + /* > + * Get the initial burstcount to ensure TPM is ready to > + * accept data, even when waiting for burstcount is disabled. > + */ > burstcnt = get_burstcount(chip); > if (burstcnt < 0) { > dev_err(&chip->dev, "Unable to read burstcount\n"); > rc = burstcnt; > goto out_err; > } > - burstcnt = min_t(int, burstcnt, len - count - 1); > + > + if (ignore_burst_count) > + sendcnt = len - 1; > + else > + sendcnt = min_t(int, burstcnt, len - count - 1); > + > rc = tpm_tis_write_bytes(priv, TPM_DATA_FIFO(priv->locality), > - burstcnt, buf + count); > + sendcnt, buf + count); > if (rc < 0) > goto out_err; > > - count += burstcnt; > + count += sendcnt; > + if (ignore_burst_count) > + continue; > > if (wait_for_tpm_stat(chip, TPM_STS_VALID, chip->timeout_c, > &priv->int_queue, false) < 0) { >