From patchwork Mon Apr 11 18:14:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Gunthorpe X-Patchwork-Id: 609015 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3qkJ9t6T8hz9sCj for ; Tue, 12 Apr 2016 04:14:26 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=sfs-ml-1.v29.ch3.sourceforge.com) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1apgLp-00040k-VU; Mon, 11 Apr 2016 18:14:17 +0000 Received: from sog-mx-3.v43.ch3.sourceforge.com ([172.29.43.193] helo=mx.sourceforge.net) by sfs-ml-1.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1apgLp-00040f-7r for tpmdd-devel@lists.sourceforge.net; Mon, 11 Apr 2016 18:14:17 +0000 Received-SPF: pass (sog-mx-3.v43.ch3.sourceforge.com: domain of obsidianresearch.com designates 184.70.90.242 as permitted sender) client-ip=184.70.90.242; envelope-from=jgunthorpe@obsidianresearch.com; helo=quartz.orcorp.ca; Received: from quartz.orcorp.ca ([184.70.90.242]) by sog-mx-3.v43.ch3.sourceforge.com with esmtps (TLSv1:AES128-SHA:128) (Exim 4.76) id 1apgLn-0007cc-DZ for tpmdd-devel@lists.sourceforge.net; Mon, 11 Apr 2016 18:14:17 +0000 Received: from [10.0.0.160] (helo=jggl.edm.orcorp.ca) by quartz.orcorp.ca with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84) (envelope-from ) id 1apgLb-00012Y-8E; Mon, 11 Apr 2016 12:14:03 -0600 Received: from jgg by jggl.edm.orcorp.ca with local (Exim 4.84) (envelope-from ) id 1apgLb-0000Jy-4F; Mon, 11 Apr 2016 12:14:03 -0600 Date: Mon, 11 Apr 2016 12:14:03 -0600 From: Jason Gunthorpe To: Jarkko Sakkinen Message-ID: <20160411181403.GB371@obsidianresearch.com> References: <1459275554-12915-1-git-send-email-stefanb@linux.vnet.ibm.com> <1459275554-12915-3-git-send-email-stefanb@linux.vnet.ibm.com> <20160407123539.GA17489@intel.com> <57068198.6050407@linux.vnet.ibm.com> <20160411084358.GB11322@intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20160411084358.GB11322@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) X-Broken-Reverse-DNS: no host name found for IP address 10.0.0.160 X-Spam-Score: -1.6 (-) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for sender-domain -0.0 SPF_HELO_PASS SPF: HELO matches SPF record -0.0 SPF_PASS SPF: sender matches SPF record -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.0 AWL AWL: Adjusted score from AWL reputation of From: address X-Headers-End: 1apgLn-0007cc-DZ Cc: linux-doc@vger.kernel.org, linux-api@vger.kernel.org, linux-kernel@vger.kernel.org, linux-security-module@vger.kernel.org, tpmdd-devel@lists.sourceforge.net Subject: Re: [tpmdd-devel] [PATCH v9 2/4] tpm: Proxy driver for supporting multiple emulated TPMs X-BeenThere: tpmdd-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Tpm Device Driver maintainance List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: tpmdd-devel-bounces@lists.sourceforge.net On Mon, Apr 11, 2016 at 11:43:58AM +0300, Jarkko Sakkinen wrote: > On Thu, Apr 07, 2016 at 11:49:44AM -0400, Stefan Berger wrote: > > On 04/07/2016 08:35 AM, Jarkko Sakkinen wrote: > > >On Tue, Mar 29, 2016 at 02:19:12PM -0400, Stefan Berger wrote: > > >>This patch implements a proxy driver for supporting multiple emulated TPMs > > >>in a system. > > >> > > >>The driver implements a device /dev/vtpmx that is used to created > > >>a client device pair /dev/tpmX (e.g., /dev/tpm10) and a server side that > > >>is accessed using a file descriptor returned by an ioctl. > > >>The device /dev/tpmX is the usual TPM device created by the core TPM > > >>driver. Applications or kernel subsystems can send TPM commands to it > > >>and the corresponding server-side file descriptor receives these > > >>commands and delivers them to an emulated TPM. > > >> > > >>Signed-off-by: Stefan Berger > > >>CC: linux-kernel@vger.kernel.org > > >>CC: linux-doc@vger.kernel.org > > >>CC: linux-api@vger.kernel.org > > >Reviewed-by: Jarkko Sakkinen > > >Tested-by: Jarkko Sakkinen > > > > Thanks. So I can post a v10 where I have to re-introduce the priv field but > > put it into the tpm_chip struct. Obviously it needs this field. I am not > > sure whether you'll let me take the Reviewed-by and Tested-by, though? > > Lets hold for them then. I'll do retest when I get the new series. Lets just fix the sysfs stuff the same way we fixed ppi and be done with this issue. Something that looks kinda like this untested thing: ------------------------------------------------------------------------------ Find and fix application performance issues faster with Applications Manager Applications Manager provides deep performance insights into multiple tiers of your business applications. It resolves application problems quickly and reduces your MTTR. Get your free trial! http://pubads.g.doubleclick.net/ gampad/clk?id=1444514301&iu=/ca-pub-7940484522588532 diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index a7c3473c3421..51e898be4307 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c @@ -36,7 +36,7 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, int i, rc; char *str = buf; - struct tpm_chip *chip = dev_get_drvdata(dev); + struct tpm_chip *chip = to_tpm_chip(dev); tpm_cmd.header.in = tpm_readpubek_header; err = tpm_transmit_cmd(chip, &tpm_cmd, READ_PUBEK_RESULT_SIZE, @@ -92,7 +92,7 @@ static ssize_t pcrs_show(struct device *dev, struct device_attribute *attr, ssize_t rc; int i, j, num_pcrs; char *str = buf; - struct tpm_chip *chip = dev_get_drvdata(dev); + struct tpm_chip *chip = to_tpm_chip(dev); rc = tpm_getcap(dev, TPM_CAP_PROP_PCR, &cap, "attempting to determine the number of PCRS"); @@ -222,7 +222,7 @@ static DEVICE_ATTR_RO(caps); static ssize_t cancel_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct tpm_chip *chip = dev_get_drvdata(dev); + struct tpm_chip *chip = to_tpm_chip(dev); if (chip == NULL) return 0; @@ -234,7 +234,7 @@ static DEVICE_ATTR_WO(cancel); static ssize_t durations_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct tpm_chip *chip = dev_get_drvdata(dev); + struct tpm_chip *chip = to_tpm_chip(dev); if (chip->duration[TPM_LONG] == 0) return 0; @@ -251,7 +251,7 @@ static DEVICE_ATTR_RO(durations); static ssize_t timeouts_show(struct device *dev, struct device_attribute *attr, char *buf) { - struct tpm_chip *chip = dev_get_drvdata(dev); + struct tpm_chip *chip = to_tpm_chip(dev); return sprintf(buf, "%d %d %d %d [%s]\n", jiffies_to_usecs(chip->timeout_a), @@ -283,22 +283,33 @@ static const struct attribute_group tpm_dev_group = { int tpm_sysfs_add_device(struct tpm_chip *chip) { - int err; - err = sysfs_create_group(&chip->dev.parent->kobj, - &tpm_dev_group); + const struct attribute **i; - if (err) - dev_err(&chip->dev, - "failed to create sysfs attributes, %d\n", err); - return err; + chip->groups[chip->groups_cnt++] = &tpm_dev_group; + if (chip->flags & TPM_CHIP_FLAG_TPM2) + return 0; + + for (i = tpm_dev_attrs; *i != NULL; ++i) { + rc = __compat_only_sysfs_link_entry_to_kobj( + &chip->dev.parent->kobj, &chip->dev.kobj, (*i)->name); + if (rc && rc != -ENOENT) { + tpm_sysfs_del_device(chip); + return rc; + } + } + + return 0; } void tpm_sysfs_del_device(struct tpm_chip *chip) { - /* The sysfs routines rely on an implicit tpm_try_get_ops, this - * function is called before ops is null'd and the sysfs core - * synchronizes this removal so that no callbacks are running or can - * run again + const struct attribute **i; + + /* The sysfs routines rely on an implicit tpm_try_get_ops, device_del + * is called before ops is null'd and the sysfs core synchronizes this + * removal so that no callbacks are running or can run again */ - sysfs_remove_group(&chip->dev.parent->kobj, &tpm_dev_group); + + for (i = tpm_dev_attrs; *i != NULL; ++i) + sysfs_remove_link(&chip->dev.parent->kobj, (*i)->name); }