Message ID | 20250204175243.810189-1-anthony.l.nguyen@intel.com (mailing list archive) |
---|---|
Headers | show |
Series | igb: fix igb_msix_other() handling for PREEMPT_RT | expand |
On 2025-02-04 09:52:36 [-0800], Tony Nguyen wrote: > Wander Lairson Costa says: > > This is the second attempt at fixing the behavior of igb_msix_other() > for PREEMPT_RT. The previous attempt [1] was reverted [2] following > concerns raised by Sebastian [3]. I still prefer a solution where we don't have the ifdef in the driver. I was presented two traces but I didn't get why it works in once case but not in the other. Maybe it was too obvious. In the mean time: igb_msg_task_irq_safe() -> vfs_raw_spin_lock_irqsave() // raw_spinlock_t -> igb_vf_reset_event() -> igb_vf_reset() -> igb_set_rx_mode() -> igb_write_mc_addr_list() -> mta_list = kcalloc(netdev_mc_count(netdev), 6, GFP_ATOMIC); // kaboom? By explicitly disabling preemption or using a raw_spinlock_t you need to pay attention not to do anything that might lead to unbounded loops (like iterating over many lists, polling on a bit for ages, …) and paying attention that the whole API underneath that it is not doing that is allowed to. Sebastian