From: Li RongQing <[email protected]>

Replace hlist_for_each_entry_rcu() with hlist_for_each_entry_srcu()
in mshv_irqfd_resampler_ack() to correctly handle SRCU-protected
linked list traversal.

The function uses SRCU (sleepable RCU) synchronization via
partition->pt_irq_srcu, but was incorrectly using the RCU variant
for list iteration. This could lead to race conditions when the
list is modified concurrently.

Also add srcu_read_lock_held() assertion as required by
hlist_for_each_entry_srcu() to ensure we're in the proper
read-side critical section.

Signed-off-by: Li RongQing <[email protected]>
---
 drivers/hv/mshv_eventfd.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/hv/mshv_eventfd.c b/drivers/hv/mshv_eventfd.c
index 0b75ff1..6d176ed 100644
--- a/drivers/hv/mshv_eventfd.c
+++ b/drivers/hv/mshv_eventfd.c
@@ -87,8 +87,9 @@ static void mshv_irqfd_resampler_ack(struct 
mshv_irq_ack_notifier *mian)
 
        idx = srcu_read_lock(&partition->pt_irq_srcu);
 
-       hlist_for_each_entry_rcu(irqfd, &resampler->rsmplr_irqfd_list,
-                                irqfd_resampler_hnode) {
+       hlist_for_each_entry_srcu(irqfd, &resampler->rsmplr_irqfd_list,
+                                irqfd_resampler_hnode,
+                                srcu_read_lock_held(&partition->pt_irq_srcu)) {
                if 
(hv_should_clear_interrupt(irqfd->irqfd_lapic_irq.lapic_control.interrupt_type))
                        hv_call_clear_virtual_interrupt(partition->pt_id);
 
-- 
2.9.4


Reply via email to