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