On Tue, Mar 28, 2023 at 06:27:09PM +0300, Sakari Ailus wrote: > On Tue, Mar 28, 2023 at 06:12:09PM +0300, Andy Shevchenko wrote: > > On Tue, Mar 28, 2023 at 01:12:56PM +0300, Sakari Ailus wrote: ... > > > + struct scan_check_crs_csi2_context inst_context = { > > > + .handle = handle, > > > + .res_head = LIST_HEAD_INIT(inst_context.res_head), > > > + }; > > > + struct crs_csi2 *csi2; > > > + > > > + acpi_walk_resources(handle, METHOD_NAME__CRS, > > > + scan_check_crs_csi2_instance, &inst_context); > > > + > > > + if (list_empty(&inst_context.res_head)) > > > + return; > > > + > > > + /* > > > + * Found entry, so allocate memory for it, fill it and add it to the > > > + * list. > > > + */ > > > + csi2 = kmalloc(sizeof(*csi2), GFP_KERNEL); > > > + if (!csi2) > > > > Who is going to release resources allocated in the callback above? > > This is done by crs_csi2_release(), called from acpi_bus_scan_crs_csi2(). Isn't it a bit counter intuitive? > > > + return; /* There's nothing we really can do about this. */ -- With Best Regards, Andy Shevchenko