All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lino Sanfilippo <LinoSanfilippo@gmx.de>
To: Jarkko Sakkinen <jarkko@kernel.org>
Cc: peterhuewe@gmx.de, jgg@ziepe.ca, stefanb@linux.vnet.ibm.com,
	linux@mniewoehner.de, linux-integrity@vger.kernel.org,
	linux-kernel@vger.kernel.org, l.sanfilippo@kunbus.com,
	lukas@wunner.de, p.rosenberger@kunbus.com
Subject: Re: [PATCH v7 07/10] tmp, tmp_tis: Implement usage counter for locality
Date: Mon, 4 Jul 2022 19:45:12 +0200	[thread overview]
Message-ID: <f0e33bc4-335c-322a-9295-18d6bc0b8286@gmx.de> (raw)
In-Reply-To: <Yr4x6KRSvzlXNdH2@kernel.org>



On 01.07.22 01:29, Jarkko Sakkinen wrote:

>
> I'm kind of thinking that should tpm_tis_data have a lock for its
> contents?

Most of the tpm_tis_data structure elements are set once during init and
then never changed but only read. So no need for locking for these. The
exceptions I see are

- flags
- locality_count
- locality


whereby "flags" is accessed by atomic bit manipulating functions and thus
does not need extra locking. "locality_count" is protected by the locality_count_mutex.
"locality" is only set in check_locality() which is called from tpm_tis_request_locality_locked()
which holds the locality_count_mutex. So check_locality() is also protected by the locality_count_mutex
(which for this reason should probably rather be called locality_mutex since it protects both the "locality_count"
and the "locality" variable).

There is one other place check_locality() is called from, namely the interrupt handler. This is also the only
place in which "locality" could be assigned another value than 0 (aka the default). In this case there
is no lock, so this could indeed by racy.

The solution I see for this is:
1. remove the entire loop that checks for the current locality, i.e. this code:

	if (interrupt & TPM_INTF_LOCALITY_CHANGE_INT)
		for (i = 0; i < 5; i++)
			if (check_locality(chip, i))
				break;

So we avoid "locality" from being changed to something that is not the default.


2. grab the locality_count_mutex and protect "locality":

if (interrupt & TPM_INTF_LOCALITY_CHANGE_INT)
	mutex_lock(&priv->locality_count_mutex);
		for (i = 0; i < 5; i++)
			if (check_locality(chip, i))
				break;
	mutex_unlock(&priv->locality_count_mutex);


I dont see the reason why we should store which locality is the active one, since the only thing
that ever would change it from 0 (i.e. the default which we use) to something else is some external instance.

So I would vote for option 1.



>
> I kind of doubt that we would ever need more than one lock for it,
> and it would give some more ensurance to not be race, especially
> when re-enabling interrupts this feels important to be "extra safe".
>
> I looked at this commit, and did not see anything that would prevent
> using a spin lock instead of mutex. With a spin lock priv can be
> accessed also in the interrupt context.
>
> So instead prepend this patch with a patch that adds:
>
>         struct spin_lock lock;
>
> And something like:
>
>         static inline struct tpm_tis_data *tpm_tis_priv_get(struct tpm_chip *chip)
>         {
>                 struct tpm_tis_data *priv = dev_get_drvdata(&chip->dev);
>
>                 spin_lock(&priv->lock);
>                 return priv;
>         }
>
>         static inline void tpm_tis_priv_put(struct tpm_tis_data *priv)
>         {
>                 spin_unlock(&priv->lock);
>         }
>
> And change the sites where priv is used to acquire the instance with this.
>

In this patch we need the mutex to protect the locality counter. We have to hold the mutex
while we do a register access that requires a locality (to make sure that the locality is not
released by another thread shortly before we do the access).

We cannot do the register access while holding a spinlock, since for SPI the (SPI) bus
lock mutex is used which needs a sleepable context. That is not given while holding a spinlock,
so I think we have no choice here unfortunately.

Regards,
Lino






  parent reply	other threads:[~2022-07-04 17:45 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-29 23:26 [PATCH v7 00/10] TPM IRQ fixes Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 01/10] tpm, tpm_tis: Avoid cache incoherency in test for interrupts Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 02/10] tpm, tpm_tis: Claim locality before writing TPM_INT_ENABLE register Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 03/10] tpm, tpm_tis: Disable interrupts if tpm_tis_probe_irq() failed Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 04/10] tpm, tmp_tis: Claim locality before writing interrupt registers Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 05/10] tpm, tpm_tis: Only handle supported interrupts Lino Sanfilippo
2022-06-30 23:18   ` Jarkko Sakkinen
2022-08-26 17:43   ` Jason Andryuk
2022-08-29  8:03     ` Lino Sanfilippo
2022-08-30  6:29     ` Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 06/10] tpm, tpm_tis: Move interrupt mask checks into own function Lino Sanfilippo
2022-06-30 23:19   ` Jarkko Sakkinen
2022-06-29 23:26 ` [PATCH v7 07/10] tmp, tmp_tis: Implement usage counter for locality Lino Sanfilippo
2022-06-30 23:29   ` Jarkko Sakkinen
2022-06-30 23:31     ` Jarkko Sakkinen
2022-07-04 17:45     ` Lino Sanfilippo [this message]
2022-07-11  2:50       ` Jarkko Sakkinen
2022-07-11 21:03         ` Lino Sanfilippo
2022-07-15 13:41           ` Jarkko Sakkinen
2022-07-27 12:16         ` Lino Sanfilippo
2022-07-28  8:15           ` Jarkko Sakkinen
2022-07-28 15:45             ` Lino Sanfilippo
2022-10-08 17:05               ` Lino Sanfilippo
2022-07-28 17:36       ` Lino Sanfilippo
2022-08-01 16:42         ` Jarkko Sakkinen
2022-07-11 19:39   ` Jason Andryuk
2022-07-11 21:15     ` Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 08/10] tpm, tpm_tis: Request threaded interrupt handler Lino Sanfilippo
2022-06-30 23:32   ` Jarkko Sakkinen
2022-06-29 23:26 ` [PATCH v7 09/10] tpm, tpm_tis: Claim locality in " Lino Sanfilippo
2022-06-29 23:26 ` [PATCH v7 10/10] tpm, tpm_tis: Enable interrupt test Lino Sanfilippo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f0e33bc4-335c-322a-9295-18d6bc0b8286@gmx.de \
    --to=linosanfilippo@gmx.de \
    --cc=jarkko@kernel.org \
    --cc=jgg@ziepe.ca \
    --cc=l.sanfilippo@kunbus.com \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@mniewoehner.de \
    --cc=lukas@wunner.de \
    --cc=p.rosenberger@kunbus.com \
    --cc=peterhuewe@gmx.de \
    --cc=stefanb@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.