Thread (88 messages) 88 messages, 6 authors, 2025-03-13

Re: [PATCH v5 07/10] Drivers: hv: Introduce per-cpu event ring tail

From: Tianyu Lan <hidden>
Date: 2025-03-13 16:00:56
Also in: linux-acpi, linux-arch, linux-hyperv, lkml

On Thu, Mar 13, 2025 at 11:56 PM Nuno Das Neves
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
On 3/13/2025 12:34 AM, Tianyu Lan wrote:
quoted
On Thu, Mar 13, 2025 at 3:45 AM Nuno Das Neves
[off-list ref] wrote:
quoted
On 3/10/2025 6:01 AM, Tianyu Lan wrote:
quoted
On Thu, Feb 27, 2025 at 7:09 AM Nuno Das Neves
[off-list ref] wrote:
quoted
Add a pointer hv_synic_eventring_tail to track the tail pointer for the
SynIC event ring buffer for each SINT.

This will be used by the mshv driver, but must be tracked independently
since the driver module could be removed and re-inserted.

Signed-off-by: Nuno Das Neves <redacted>
Reviewed-by: Wei Liu <wei.liu@kernel.org>
It's better to expose a function to check the tail instead of exposing
hv_synic_eventring_tail directly.
What is the advantage of using a function for this? We need to both set
and get the tail.
We may add lock or check to avoid race conditions and this depends on the
user case. This is why I want to see how mshv driver uses it.
quoted
quoted
BTW, how does mshv driver use hv_synic_eventring_tail? Which patch
uses it in this series?
This variable stores indices into the synic eventring page (one for each
SINT, and per-cpu). Each SINT has a ringbuffer of u32 messages. The tail
index points to the latest one.

This is only used for doorbell messages today. The message in this case is
a port number which is used to lookup and invoke a callback, which signals
ioeventfd(s), to notify the VMM of a guest MMIO write.

It is used in patch 10.
I found "extern u8 __percpu **hv_synic_eventring_tail;" in the
drivers/hv/mshv_root.h of patch 10.
I seem to miss the code to use it.

+int hv_call_unmap_stat_page(enum hv_stats_object_type type,
+                           const union hv_stats_object_identity *identity);
+int hv_call_modify_spa_host_access(u64 partition_id, struct page **pages,
+                                  u64 page_struct_count, u32 host_access,
+                                  u32 flags, u8 acquire);
+
+extern struct mshv_root mshv_root;
+extern enum hv_scheduler_type hv_scheduler_type;
+extern u8 __percpu **hv_synic_eventring_tail;
+
+#endif /* _MSHV_ROOT_H_ */
It is used in mshv_synic.c in synic_event_ring_get_queued_port():
diff --git a/drivers/hv/mshv_synic.c b/drivers/hv/mshv_synic.c
new file mode 100644
index 000000000000..e7782f92e339
--- /dev/null
+++ b/drivers/hv/mshv_synic.c
@@ -0,0 +1,665 @@
<snip>
+static u32 synic_event_ring_get_queued_port(u32 sint_index)
+{
+       struct hv_synic_event_ring_page **event_ring_page;
+       volatile struct hv_synic_event_ring *ring;
+       struct hv_synic_pages *spages;
+       u8 **synic_eventring_tail;
+       u32 message;
+       u8 tail;
+
+       spages = this_cpu_ptr(mshv_root.synic_pages);
+       event_ring_page = &spages->synic_event_ring_page;
+       synic_eventring_tail = (u8 **)this_cpu_ptr(hv_synic_eventring_tail);
+       tail = (*synic_eventring_tail)[sint_index];
OK. I got it. Thanks.

-- 
Thanks
Tianyu Lan
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help