On Mon, Nov 07, 2022 at 10:20:37AM -0800, Dmitry Torokhov wrote: > On Mon, Nov 07, 2022 at 06:10:27PM +0200, Andy Shevchenko wrote: > > +static unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc) > > +{ > > + int size; > > + > > + size = fwnode_property_count_u32(gc->fwnode, "gpio-reserved-ranges"); > > I wonder if a comment why we need even size would not be helpful. Was it in the original code? Anyway, if Bart thinks so as well, I may add it in v2. > > + if (size > 0 && size % 2 == 0) > > + return size; > > + > > + return 0; > > +} > > + > > static int gpiochip_alloc_valid_mask(struct gpio_chip *gc) > > { > > - if (!(of_gpio_need_valid_mask(gc) || gc->init_valid_mask)) > > + if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask)) > > return 0; > > > > gc->valid_mask = gpiochip_allocate_mask(gc); > > @@ -457,8 +468,47 @@ static int gpiochip_alloc_valid_mask(struct gpio_chip *gc) > > return 0; > > } > > > > +static int gpiochip_apply_reserved_ranges(struct gpio_chip *gc, unsigned int sz) > > +{ > > + u32 *ranges; > > + int ret; > > + > > + ranges = kmalloc_array(sz, sizeof(*ranges), GFP_KERNEL); > > + if (!ranges) > > + return -ENOMEM; > > + > > + ret = fwnode_property_read_u32_array(gc->fwnode, "gpio-reserved-ranges", ranges, sz); > > + if (ret) { > > + kfree(ranges); > > + return ret; > > + } > > + > > + while (sz) { > > + u32 count = ranges[--sz]; > > + u32 start = ranges[--sz]; > > I know we checked sz validity, but I wonder if re-checking it in this > function would not insulate us from errors creeping in after some other > code refactoring. I'm not sure I understand what you meant. The fwnode_property_read_u32_array() will fail if the given sz is too big for the real data, so while (sz) would never even go on the invalid data. > In any case, > > Reviewed-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx> Thank you! -- With Best Regards, Andy Shevchenko