]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commit
Drivers: hv: vmbus: Fix race condition with new ring_buffer_info mutex
authorKimberly Brown <kimbrownkd@gmail.com>
Thu, 14 Mar 2019 20:05:15 +0000 (16:05 -0400)
committerSasha Levin <sashal@kernel.org>
Wed, 10 Apr 2019 22:58:56 +0000 (18:58 -0400)
commit14948e39445db674516ccabdf01090586ecfdc9b
treec7dde66befabf1f3d78652672c73ff0f1ec5ea62
parent4713eb7b580a269f827ea82f4c25bebae963e0e8
Drivers: hv: vmbus: Fix race condition with new ring_buffer_info mutex

Fix a race condition that can result in a ring buffer pointer being set
to null while a "_show" function is reading the ring buffer's data. This
problem was discussed here: https://lkml.org/lkml/2018/10/18/779

To fix the race condition, add a new mutex lock to the
"hv_ring_buffer_info" struct. Add a new function,
"hv_ringbuffer_pre_init()", where a channel's inbound and outbound
ring_buffer_info mutex locks are initialized.

Acquire/release the locks in the "hv_ringbuffer_cleanup()" function,
which is where the ring buffer pointers are set to null.

Acquire/release the locks in the four channel-level "_show" functions
that access ring buffer data. Remove the "const" qualifier from the
"vmbus_channel" parameter and the "rbi" variable of the channel-level
"_show" functions so that the locks can be acquired/released in these
functions.

Acquire/release the locks in hv_ringbuffer_get_debuginfo(). Remove the
"const" qualifier from the "hv_ring_buffer_info" parameter so that the
locks can be acquired/released in this function.

Signed-off-by: Kimberly Brown <kimbrownkd@gmail.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hv/channel_mgmt.c
drivers/hv/hyperv_vmbus.h
drivers/hv/ring_buffer.c
drivers/hv/vmbus_drv.c
include/linux/hyperv.h