RE: [PATCH 2/2] Drivers: hv: vmbus: Resolve more races involving init_vp_index()
From: Michael Kelley
Date: Fri May 22 2020 - 14:41:19 EST
From: Andrea Parri (Microsoft) <parri.andrea@xxxxxxxxx>
>
> init_vp_index() uses the (per-node) hv_numa_map[] masks to record the
> CPUs allocated for channel interrupts at a given time, and distribute
> the performance-critical channels across the available CPUs: in part.,
> the mask of "candidate" target CPUs in a given NUMA node, for a newly
> offered channel, is determined by XOR-ing the node's CPU mask and the
> node's hv_numa_map. This operation/mechanism assumes that no offline
> CPUs is set in the hv_numa_map mask, an assumption that does not hold
> since such mask is currently not updated when a channel is removed or
> assigned to a different CPU.
>
> To address the issues described above, this adds hooks in the channel
> removal path (hv_process_channel_removal()) and in target_cpu_store()
> in order to clear, resp. to update, the hv_numa_map[] masks as needed.
> This also adds a (missed) update of the masks in init_vp_index() (cf.,
> e.g., the memory-allocation failure path in this function).
>
> Like in the case of init_vp_index(), such hooks require to determine
> if the given channel is performance critical. init_vp_index() does
> this by parsing the channel's offer, it can not rely on the device
> data structure (device_obj) to retrieve such information because the
> device data structure has not been allocated/linked with the channel
> by the time that init_vp_index() executes. A similar situation may
> hold in hv_is_alloced_cpu() (defined below); the adopted approach is
> to "cache" the device type of the channel, as computed by parsing the
> channel's offer, in the channel structure itself.
>
> Fixes: 7527810573436f ("Drivers: hv: vmbus: Introduce the
> CHANNELMSG_MODIFYCHANNEL message type")
> Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@xxxxxxxxx>
> ---
> drivers/hv/channel_mgmt.c | 22 +++++++++++++-----
> drivers/hv/hyperv_vmbus.h | 48 +++++++++++++++++++++++++++++++++++++++
> drivers/hv/vmbus_drv.c | 19 +++++++++++-----
> include/linux/hyperv.h | 7 ++++++
> 4 files changed, 84 insertions(+), 12 deletions(-)
Reviewed-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>