mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "M K, Muralidhara" <muralimk@amd.com>
To: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
	"Muralidhara M K" <muralidhara.mk@amd.com>
Cc: platform-driver-x86@vger.kernel.org,
	LKML <linux-kernel@vger.kernel.org>,
	muthusamy.ramalingam@amd.com
Subject: Re: [PATCH v6 6/6] platform/x86/amd/hsmp: Serialize the data plane against socket teardown
Date: Thu, 23 Jul 2026 11:02:23 +0530	[thread overview]
Message-ID: <85095ac8-ca4e-41fe-8e64-4d0fef334789@amd.com> (raw)
In-Reply-To: <f17da159-2a34-79ea-5fd1-b73b91ea680b@linux.intel.com>



On 7/22/2026 6:41 PM, Ilpo Järvinen wrote:
> Caution: This message originated from an External Source. Use proper caution when opening attachments, clicking links, or responding.
> 
> 
> On Mon, 13 Jul 2026, Muralidhara M K wrote:
> 
>> The HSMP data plane is lock-free: open /dev/hsmp fds and hwmon sysfs reads
>> call hsmp_send_message() without any coordination with driver teardown.
>> misc_deregister() does not drain already-open fds, so an in-flight message
>> can race a concurrent unbind and touch a freed socket array or an unmapped
>> mailbox.
>>
>> Add the read side of hsmp_sock_rwsem to the data plane. Split the message
>> send into hsmp_send_message_locked(), which does the bounds check and MMIO
>> access and asserts the rwsem is held, and hsmp_send_message(), which wraps
>> it in guard(rwsem_read). Probe and remove hold the rwsem for write, so they
>> drain in-flight messages and keep new ones out while they tear a socket
>> down.
>>
>> The probe-time senders run under the probe write lock and so must not take
>> the rwsem again: route hsmp_test(), hsmp_cache_proto_ver() and
>> hsmp_get_tbl_dram_base() through hsmp_send_message_locked() to avoid
>> recursive locking. A single rwsem therefore covers both the data plane and
>> the probe/remove handshake, with no separate probe lock:
>>
>>   - acpi.c already holds it for write across probe for the socket-array and
>>     misc-registration handshake, so the mailbox handshake now nests under
>>     that same lock.
>>
>>   - plat.c takes it for write around init_platform_device(). It is not held
>>     across devm_add_action_or_reset() so the release action, which also
>>     takes it for write, cannot deadlock if that registration fails.
>>
>> Signed-off-by: Muralidhara M K <muralidhara.mk@amd.com>
>> ---
> 
> While the code seems okay AFAICT, I think the comments are somewhat
> misleading:
> 
>> +int hsmp_send_message(struct hsmp_message *msg)
>> +{
>> +     /*
>> +      * The data plane is lock-free: open /dev/hsmp fds and hwmon sysfs reads
> 
> This says data plane is lock-free.
> 
>> +      * issue messages without coordinating with driver teardown. Take
>> +      * hsmp_sock_rwsem for read so messages run concurrently with each other
>> +      * but are drained and kept out while probe/remove hold it for write to
>> +      * tear a socket down.
>> +      */
>> +     guard(rwsem_read)(&hsmp_sock_rwsem);
>> +
>> +     return hsmp_send_message_locked(msg);
>> +}
>>   EXPORT_SYMBOL_NS_GPL(hsmp_send_message, "AMD_HSMP");
> 
> 
>> diff --git a/drivers/platform/x86/amd/hsmp/hsmp.h b/drivers/platform/x86/amd/hsmp/hsmp.h
>> index 45dab9253c13..cfd1a8cbd459 100644
>> --- a/drivers/platform/x86/amd/hsmp/hsmp.h
>> +++ b/drivers/platform/x86/amd/hsmp/hsmp.h
>> @@ -79,8 +79,8 @@ static inline int hsmp_create_sensor(struct device *dev, u16 sock_ind) { return
>>   int hsmp_msg_get_nargs(u16 sock_ind, u32 msg_id, u32 *data, u8 num_args);
>>
>>   /*
>> - * Serializes HSMP socket bring-up and teardown. ACPI probe and remove take it
>> - * for write.
>> + * Gates the HSMP data plane: hsmp_send_message() takes it for read; probe and
>> + * remove take it for write to bring sockets up and tear them down.
>>    */
>>   extern struct rw_semaphore hsmp_sock_rwsem;
> 
> This says data plane is gated.
> 
> Both cannot be true?
> 
>> @@ -204,15 +206,20 @@ static int init_platform_device(struct device *dev)
>>   /*
>>    * The socket array is devm-managed and freed by the driver core, but the
>>    * metric-table DRAM regions are mapped with plain ioremap() during probe and
>> - * are therefore not covered by devres.
>> + * the per-socket mutexes need an explicit mutex_destroy(), neither of which
>> + * devres covers.
>>    *
>> - * Drop those mappings from a devres action so both remove and probe failure
>> - * unmap them exactly once, before the socket array they refer to is freed.
>> + * Take the data-plane rwsem for write to drain any in-flight
> 
> This too talks about data-plane rwsem.
> 
>> + * hsmp_send_message(), unmap the metric tables, destroy the mutexes and drop
>> + * the global socket pointer, all before devres frees the array. Registered as
>> + * a devres action so it runs on both remove and probe failure.
>>    */
>>   static void hsmp_pltdrv_release(void *data)
>>   {
>> +     guard(rwsem_write)(&hsmp_sock_rwsem);
>>        hsmp_unmap_metric_tbls(hsmp_pdev);
>>        hsmp_destroy_metric_read_locks(hsmp_pdev);
>> +     hsmp_pdev->sock = NULL;
>>   }
> 
> My own understanding here is that the first comment tried to tell what
> the situation was before this patch (data plane was indeed lock free), not
> the behavior after the patch. Is my understanding correct?
> 
> To avoid potential terminology related confusion, rwsem is still a lock
> (even if the read sides are not block each other).
> 
> We don't write about historic state of things but document only the
> current code does. So if it's no longer lock free, stating it's lock
> free is sure way to confuse the reader. :-)
> 
You're right on both counts, thanks for catching it.

Yes -- the "lock-free" wording described the pre-patch state, not the
behavior after this patch. After the series hsmp_send_message() takes
hsmp_sock_rwsem for read, so the data plane is gated by a lock; the read
side just doesn't exclude other readers. Calling it "lock-free" in a
current-state comment directly contradicted the rwsem documentation in
hsmp.h, so I've dropped that wording everywhere it described the current
code.

I will submit v7 which is a comment-only change on top of v6 (no 
functional change).
> --
>   i.
> 


  reply	other threads:[~2026-07-23  5:32 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-13  4:39 [PATCH v6 0/6] " Muralidhara M K
2026-07-13  4:40 ` [PATCH v6 1/6] platform/x86/amd/hsmp: Serialize ACPI HSMP probe and remove with an rwsem Muralidhara M K
2026-07-13  4:40 ` [PATCH v6 2/6] platform/x86/amd/hsmp: Map the metric table with ioremap() and unmap it explicitly Muralidhara M K
2026-07-13  4:40 ` [PATCH v6 3/6] platform/x86/amd/hsmp: Serialize per-socket metric table reads with a mutex Muralidhara M K
2026-07-13  4:40 ` [PATCH v6 4/6] platform/x86/amd/hsmp: Clear mdev.this_device on deregister Muralidhara M K
2026-07-13  4:40 ` [PATCH v6 5/6] platform/x86/amd/hsmp: ACPI HSMP refcounted sockets and coordinated release Muralidhara M K
2026-07-13  4:40 ` [PATCH v6 6/6] platform/x86/amd/hsmp: Serialize the data plane against socket teardown Muralidhara M K
2026-07-22 13:11   ` Ilpo Järvinen
2026-07-23  5:32     ` M K, Muralidhara [this message]
2026-07-20 15:32 ` [PATCH v6 0/6] " M K, Muralidhara

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=85095ac8-ca4e-41fe-8e64-4d0fef334789@amd.com \
    --to=muralimk@amd.com \
    --cc=ilpo.jarvinen@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=muralidhara.mk@amd.com \
    --cc=muthusamy.ramalingam@amd.com \
    --cc=platform-driver-x86@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome