On Tue, Sep 06, 2022 at 03:54:06PM +0300, Andy Shevchenko wrote: > On Mon, Sep 05, 2022 at 12:35:42PM -0700, Dmitry Torokhov wrote: > > On Mon, Sep 05, 2022 at 08:20:01PM +0300, Andy Shevchenko wrote: > > ... > > > > + subsys = acpi_get_subsystem_id(ACPI_HANDLE(dev)); > > > + if (IS_ERR(subsys) && PTR_ERR(subsys) != -ENODATA) > > > + return PTR_ERR(subsys); > > > + > > > + if (IS_ERR(subsys) && PTR_ERR(subsys) == -ENODATA) > > > + subsys = kstrdup_const("unknown", GFP_KERNEL); > > > > Do we really need kstrdup_const() here? This makes me wonder if we need > > to also have error handling here, and if we going to tip some automated > > tools by not having it. Why can't we simply assign the constant here > > (and continue using kfree_const() below)? > > Which makes code inconsistent. But okay, no big deal. To me the *_const() APIs are needed when the code does not really know if it deals with a const/read-only object or not. If we know for sure we are dealing with a const/read-only object, we can skip allocation and freeing, so I do not see any inconsistencies. > > > I think this is the case where PTR_ERR_OR_ZERO() might help avoid > > multiple IS_ERR/PTR_ERR: > > > > subsys = acpi_get_subsystem_id(ACPI_HANDLE(dev)); > > error = PTR_ERR_OR_ZERO(subsys); > > if (error == -ENODATA) > > subsys = "unknown"; > > else if (error) > > return error; > > Would it matter? The generated code will be the same in both cases, no? No, in the end I think the optimizer will reduce both variants to the same thing. I do find mine a bit more compact and thus easier to read, but I will not insist. Thanks. -- Dmitry