On Mon, 18 Sep 2023 17:31:36 +0200, Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> said: > On Mon, Sep 18, 2023 at 04:55:33PM +0200, Bartosz Golaszewski wrote: >> From: Bartosz Golaszewski <bartosz.golaszewski@xxxxxxxxxx> >> >> gpio_sim_make_line_names() returns NULL or ERR_PTR() so we must not use >> __free(kfree) on the returned address. Split this function into two, one >> that determines the size of the "gpio-line-names" array to allocate and >> one that actually sets the names at correct offsets. The allocation and >> assignment of the managed pointer happens in between. > > ... > >> + unsigned int size = 0; >> >> list_for_each_entry(line, &bank->line_list, siblings) { >> + if (!line->name || (line->offset >= bank->num_lines)) >> continue; >> >> + size = line->offset + 1; >> } >> >> + return size; > > So, now the function iterates over all lines and returns the size of the last > match, correct? > > Why not > > list_for_each_entry_reversed() { > if (line->name && ()) > break; > } > > return size; > > ? Because the line objects are not sorted by offset. They are added at the end of the list in the order the user creates their corresponding configfs groups. > > ... > >> +static void >> +gpio_sim_set_line_names(struct gpio_sim_bank *bank, char **line_names) >> +{ >> + struct gpio_sim_line *line; >> >> list_for_each_entry(line, &bank->line_list, siblings) { >> - if (line->offset >= bank->num_lines) >> + if (!line->name || (line->offset >= bank->num_lines)) >> continue; >> >> - if (line->name && (line->offset <= max_offset)) >> - line_names[line->offset] = line->name; >> + line_names[line->offset] = line->name; >> } >> - >> - return line_names; >> } > > Can be done in the similar (I see the difference) way for the consistency with > above. > > ... > >> + line_names_size = gpio_sim_get_line_names_size(bank); > >> + if (line_names_size) { > > Of course this can be replace with... > >> + line_names = kcalloc(line_names_size, sizeof(*line_names), >> + GFP_KERNEL); > >> + if (!line_names) > > ZERO_OR_NULL_PTR() check here, but I assume we discourage use of it. Why? There are less than 40 instances of using it in the kernel. kmalloc() returns NULL on failure. Bart > >> + return ERR_PTR(-ENOMEM); >> + >> + gpio_sim_set_line_names(bank, line_names); >> >> - if (line_names) >> properties[prop_idx++] = PROPERTY_ENTRY_STRING_ARRAY_LEN( >> "gpio-line-names", >> line_names, line_names_size); >> + } > > -- > With Best Regards, > Andy Shevchenko > > >