mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-02-22 02:45:40 +07:00
![]() The rpmh-rsc code had both a driver-level lock (sometimes referred to in comments as drv->lock) and a lock per-TCS. The idea was supposed to be that there would be times where you could get by with just locking a TCS lock and therefor other RPMH users wouldn't be blocked. The above didn't work out so well. Looking at tcs_write() the bigger drv->lock was held for most of the function anyway. Only the __tcs_buffer_write() and __tcs_set_trigger() calls were called without holding the drv->lock. It actually turns out that in tcs_write() we don't need to hold the drv->lock for those function calls anyway even if the per-TCS lock isn't there anymore. From the newly added comments in the code, this is because: - We marked "tcs_in_use" under lock. - Once "tcs_in_use" has been marked nobody else could be writing to these registers until the interrupt goes off. - The interrupt can't go off until we trigger w/ the last line of __tcs_set_trigger(). Thus, from a tcs_write() point of view, the per-TCS lock was useless. Looking at rpmh_rsc_write_ctrl_data(), only the per-TCS lock was held. It turns out, though, that this function already needs to be called with the equivalent of the drv->lock held anyway (we either need to hold drv->lock as we will in a future patch or we need to know no other CPUs could be running as happens today). Specifically rpmh_rsc_write_ctrl_data() might be writing to a TCS that has been borrowed for writing an active transation but it never checks this. Let's eliminate this extra overhead and avoid possible AB BA locking headaches. Suggested-by: Maulik Shah <mkshah@codeaurora.org> Signed-off-by: Douglas Anderson <dianders@chromium.org> Reviewed-by: Stephen Boyd <swboyd@chromium.org> Link: https://lore.kernel.org/r/20200504104917.v6.4.Ib8dccfdb10bf6b1fb1d600ca1c21d9c0db1ef746@changeid Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> |
||
---|---|---|
.. | ||
apr.c | ||
cmd-db.c | ||
glink_ssr.c | ||
Kconfig | ||
llcc-qcom.c | ||
Makefile | ||
mdt_loader.c | ||
ocmem.c | ||
pdr_interface.c | ||
pdr_internal.h | ||
qcom_aoss.c | ||
qcom_gsbi.c | ||
qcom-geni-se.c | ||
qmi_encdec.c | ||
qmi_interface.c | ||
rmtfs_mem.c | ||
rpmh-internal.h | ||
rpmh-rsc.c | ||
rpmh.c | ||
rpmhpd.c | ||
rpmpd.c | ||
smd-rpm.c | ||
smem_state.c | ||
smem.c | ||
smp2p.c | ||
smsm.c | ||
socinfo.c | ||
spm.c | ||
trace-rpmh.h | ||
wcnss_ctrl.c |