Messages in this thread | | | Date | Fri, 21 Jul 2023 08:05:49 -0700 | Subject | Re: [RFC PATCH 2/2] regmap: Reject fast_io regmap configurations with RBTREE and MAPLE caches | From | Guenter Roeck <> |
| |
On 7/21/23 07:53, Marek Szyprowski wrote: > Hi, > > On 20.07.2023 05:28, Guenter Roeck wrote: >> REGCACHE_RBTREE and REGCACHE_MAPLE dynamically allocate memory for regmap >> operations. This is incompatible with spinlock based locking which is used >> for fast_io operations. Reject affected configurations. >> >> Signed-off-by: Guenter Roeck <linux@roeck-us.net> >> --- >> This seems prudent, given that accesses will be protected by spinlock >> but may allocate memory with GFP_KERNEL. Another option might be to use >> WARN_ON instead of rejecting the configuration to avoid hard regressions >> (and I think both drivers/net/ieee802154/mcr20a.c and >> sound/soc/codecs/sti-sas.c may be affected, though I can not test it). > > This patch, which landed in today's linux-next, breaks operation of the > RockChip's VOP2 DRM driver > (drivers/gpu/drm/rockchip/rockchip_drm_vop2.c). I'm not sure what is the > proper fix in this case. Should one change the cache type to REGCACHE_FLAT? >
Ah, I missed regcache_init_mmio() when looking for affected drivers. This affects a larger number of drivers than I thought. In addition to the drivers mentioned above,
drivers/soc/qcom/icc-bwmon.c sound/soc/bcm/bcm2835-i2s.c sound/soc/codecs/jz4740.c sound/soc/fsl/fsl_aud2htx.c sound/soc/fsl/fsl_easrc.c sound/soc/fsl/fsl_micfil.c
all use unsafe locking (spinlock with REGCACHE_RBTREE).
Thanks, Guenter
> >> drivers/base/regmap/regmap.c | 9 +++++++++ >> 1 file changed, 9 insertions(+) >> >> diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c >> index 89a7f1c459c1..b4640285c0b9 100644 >> --- a/drivers/base/regmap/regmap.c >> +++ b/drivers/base/regmap/regmap.c >> @@ -777,6 +777,15 @@ struct regmap *__regmap_init(struct device *dev, >> } else { >> if ((bus && bus->fast_io) || >> config->fast_io) { >> + /* >> + * fast_io is incompatible with REGCACHE_RBTREE and REGCACHE_MAPLE >> + * since both need to dynamically allocate memory. >> + */ >> + if (config->cache_type == REGCACHE_RBTREE || >> + config->cache_type == REGCACHE_MAPLE) { >> + ret = -EINVAL; >> + goto err_name; >> + } >> if (config->use_raw_spinlock) { >> raw_spin_lock_init(&map->raw_spinlock); >> map->lock = regmap_lock_raw_spinlock; > > Best regards
| |