From: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
To: Romain Gantois <romain.gantois@bootlin.com>
Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Kory Maincent <kory.maincent@bootlin.com>,
linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org, linux-media@vger.kernel.org,
linux-gpio@vger.kernel.org,
Wolfram Sang <wsa+renesas@sang-engineering.com>,
Luca Ceresoli <luca.ceresoli@bootlin.com>,
Andi Shyti <andi.shyti@kernel.org>, Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Derek Kiernan <derek.kiernan@amd.com>,
Dragan Cvetic <dragan.cvetic@amd.com>,
Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <brgl@bgdev.pl>
Subject: Re: [PATCH v4 3/9] media: i2c: ds90ub960: Protect alias_use_mask with a mutex
Date: Mon, 6 Jan 2025 11:38:43 +0200 [thread overview]
Message-ID: <73dd31df-cce6-445e-bf69-67b9854e9444@ideasonboard.com> (raw)
In-Reply-To: <20241230-fpc202-v4-3-761b297dc697@bootlin.com>
Hi,
On 30/12/2024 15:22, Romain Gantois wrote:
> The aliased_addrs list represents the occupation of an RX port's hardware
> alias table. This list and the underlying hardware table are only accessed
> in the attach/detach_client() callbacks.
>
> These functions are only called from a bus notifier handler in i2c-atr.c,
> which is always called with the notifier chain's semaphore held. This
> indirectly prevents concurrent access to the aliased_addrs list.
> However, more explicit and direct locking is preferable. Moreover, with the
> introduction of dynamic address translation in a future patch, the
> attach/detach_client() callbacks will be called from outside of the
> notifier chain's read section.
>
> Introduce a mutex to protect access to the aliased_addrs list and its
> underlying hardware table.
>
> Signed-off-by: Romain Gantois <romain.gantois@bootlin.com>
> ---
> drivers/media/i2c/ds90ub960.c | 23 ++++++++++++++++++++---
> 1 file changed, 20 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
> index 7534ddf2079fef466d3a114f0be98599427639fa..0510427ac4e9214132bcdf3fa18873ec78c48a5e 100644
> --- a/drivers/media/i2c/ds90ub960.c
> +++ b/drivers/media/i2c/ds90ub960.c
> @@ -467,6 +467,8 @@ struct ub960_rxport {
> };
> } eq;
>
> + /* lock for aliased_addrs and associated registers */
> + struct mutex aliased_addrs_lock;
> u16 aliased_addrs[UB960_MAX_PORT_ALIASES];
> };
>
> @@ -1030,6 +1032,9 @@ static int ub960_atr_attach_client(struct i2c_atr *atr, u32 chan_id,
> struct ub960_rxport *rxport = priv->rxports[chan_id];
> struct device *dev = &priv->client->dev;
> unsigned int reg_idx;
> + int ret = 0;
> +
> + mutex_lock(&rxport->aliased_addrs_lock);
A mutex guard could be used here and below.
Tomi
>
> for (reg_idx = 0; reg_idx < UB960_MAX_PORT_ALIASES; reg_idx++) {
> if (!rxport->aliased_addrs[reg_idx])
> @@ -1038,7 +1043,8 @@ static int ub960_atr_attach_client(struct i2c_atr *atr, u32 chan_id,
>
> if (reg_idx == UB960_MAX_PORT_ALIASES) {
> dev_err(dev, "rx%u: alias pool exhausted\n", rxport->nport);
> - return -EADDRNOTAVAIL;
> + ret = -EADDRNOTAVAIL;
> + goto out_unlock;
> }
>
> rxport->aliased_addrs[reg_idx] = client->addr;
> @@ -1051,7 +1057,9 @@ static int ub960_atr_attach_client(struct i2c_atr *atr, u32 chan_id,
> dev_dbg(dev, "rx%u: client 0x%02x assigned alias 0x%02x at slot %u\n",
> rxport->nport, client->addr, alias, reg_idx);
>
> - return 0;
> +out_unlock:
> + mutex_unlock(&rxport->aliased_addrs_lock);
> + return ret;
> }
>
> static void ub960_atr_detach_client(struct i2c_atr *atr, u32 chan_id,
> @@ -1062,6 +1070,8 @@ static void ub960_atr_detach_client(struct i2c_atr *atr, u32 chan_id,
> struct device *dev = &priv->client->dev;
> unsigned int reg_idx;
>
> + mutex_lock(&rxport->aliased_addrs_lock);
> +
> for (reg_idx = 0; reg_idx < UB960_MAX_PORT_ALIASES; reg_idx++) {
> if (rxport->aliased_addrs[reg_idx] == client->addr)
> break;
> @@ -1070,7 +1080,7 @@ static void ub960_atr_detach_client(struct i2c_atr *atr, u32 chan_id,
> if (reg_idx == UB960_MAX_PORT_ALIASES) {
> dev_err(dev, "rx%u: client 0x%02x is not mapped!\n",
> rxport->nport, client->addr);
> - return;
> + goto out_unlock;
> }
>
> rxport->aliased_addrs[reg_idx] = 0;
> @@ -1079,6 +1089,9 @@ static void ub960_atr_detach_client(struct i2c_atr *atr, u32 chan_id,
>
> dev_dbg(dev, "rx%u: client 0x%02x released at slot %u\n", rxport->nport,
> client->addr, reg_idx);
> +
> +out_unlock:
> + mutex_unlock(&rxport->aliased_addrs_lock);
> }
>
> static const struct i2c_atr_ops ub960_atr_ops = {
> @@ -3181,6 +3194,8 @@ static void ub960_rxport_free_ports(struct ub960_data *priv)
> fwnode_handle_put(rxport->source.ep_fwnode);
> fwnode_handle_put(rxport->ser.fwnode);
>
> + mutex_destroy(&rxport->aliased_addrs_lock);
> +
> kfree(rxport);
> priv->rxports[nport] = NULL;
> }
> @@ -3401,6 +3416,8 @@ static int ub960_parse_dt_rxport(struct ub960_data *priv, unsigned int nport,
> if (ret)
> goto err_put_remote_fwnode;
>
> + mutex_init(&rxport->aliased_addrs_lock);
> +
> return 0;
>
> err_put_remote_fwnode:
>
next prev parent reply other threads:[~2025-01-06 9:38 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-30 13:22 [PATCH v4 0/9] misc: Support TI FPC202 dual-port controller Romain Gantois
2024-12-30 13:22 ` [PATCH v4 1/9] dt-bindings: misc: Describe TI FPC202 dual port controller Romain Gantois
2025-01-06 20:10 ` Conor Dooley
2024-12-30 13:22 ` [PATCH v4 2/9] media: i2c: ds90ub960: Replace aliased clients list with address list Romain Gantois
2025-01-06 9:34 ` Tomi Valkeinen
2025-01-08 13:27 ` Romain Gantois
2025-01-08 13:32 ` Tomi Valkeinen
2025-01-08 13:50 ` Romain Gantois
2024-12-30 13:22 ` [PATCH v4 3/9] media: i2c: ds90ub960: Protect alias_use_mask with a mutex Romain Gantois
2025-01-06 9:38 ` Tomi Valkeinen [this message]
2024-12-30 13:22 ` [PATCH v4 4/9] i2c: use client addresses directly in ATR interface Romain Gantois
2025-01-06 9:51 ` Tomi Valkeinen
2025-01-08 13:31 ` Romain Gantois
2025-01-08 13:38 ` Tomi Valkeinen
2025-01-08 14:35 ` Romain Gantois
2024-12-30 13:22 ` [PATCH v4 5/9] i2c: move ATR alias pool to a separate struct Romain Gantois
2024-12-30 13:22 ` [PATCH v4 6/9] i2c: rename field 'alias_list' of struct i2c_atr_chan to 'alias_pairs' Romain Gantois
2024-12-30 13:22 ` [PATCH v4 7/9] i2c: support per-channel ATR alias pools Romain Gantois
2024-12-30 13:22 ` [PATCH v4 8/9] i2c: Support dynamic address translation Romain Gantois
2024-12-30 13:22 ` [PATCH v4 9/9] misc: add FPC202 dual port controller driver Romain Gantois
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=73dd31df-cce6-445e-bf69-67b9854e9444@ideasonboard.com \
--to=tomi.valkeinen@ideasonboard.com \
--cc=andi.shyti@kernel.org \
--cc=arnd@arndb.de \
--cc=brgl@bgdev.pl \
--cc=conor+dt@kernel.org \
--cc=derek.kiernan@amd.com \
--cc=devicetree@vger.kernel.org \
--cc=dragan.cvetic@amd.com \
--cc=gregkh@linuxfoundation.org \
--cc=kory.maincent@bootlin.com \
--cc=krzk+dt@kernel.org \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=luca.ceresoli@bootlin.com \
--cc=mchehab@kernel.org \
--cc=robh@kernel.org \
--cc=romain.gantois@bootlin.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=wsa+renesas@sang-engineering.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.