Messages in this thread | | | From | "Zhang, Ning A" <> | Subject | Re: [PATCH] firmware: make sure builtin firmware is page alignment | Date | Mon, 6 Aug 2018 05:13:17 +0000 |
| |
在 2018-08-06一的 01:48 +0000,Zhang, Ning A写道: > 在 2018-08-03五的 12:31 +0200,gregkh@linuxfoundation.org写道: > > On Fri, Aug 03, 2018 at 08:42:25AM +0000, Zhang, Ning A wrote: > > > 在 2018-08-03五的 07:39 +0200,Greg KH写道: > > > > On Fri, Aug 03, 2018 at 09:45:21AM +0800, Zhang Ning wrote: > > > > > when firmware is in filesystem, request_firmware will load > > > > > it, > > > > > and copy it to vmalloc memory, that is page align memory. > > > > > > > > > > but when firmware is builtin, it is 8 bytes or 4 bytes > > > > > alignment. > > > > > > > > > > make sure builtin firmware is page algnment, that can > > > > > simplify > > > > > algorithm > > > > > to handle firmware. > > > > > > > > How is it simplified? I don't see any such change like that > > > > here > > > > :( > > > > > > > > > > Thank you for review this patch. > > > > > > When driver handles its firmware based on page, like below: > > > > > > struct page *p; > > > p = vmalloc_to_page(fw->data); // for filesystem firmware > > > p = virt_to_page(fw->data); // for builtin firmware > > > > > > but if builtin firmware is not page alignment, page pointer for > > > builtin > > > firmware is wrong, it contains memory not belong to firmware. > > > drivers > > > has to use additional code to handle this. > > > > > > if builtin firmware is also page alignment, no need additional > > > code > > > to > > > handle builtin firmware. simplified. > > > > But you did not change anything like this in your code, so why > > would > > I > > know this? > > I understand it is very difficult to review this patch without > context. > The driver is not opensource, I can't show the patch for driver. > > this patch changes kernel common code, and it has value to upstream, > so > I submit this patch for review and also look forward some advises > from > community. Once we decide to opensource, the driver changes will be > there. > >
as said our driver handles firmware based on page, and if firmware is builtin, page point from virt_to_page(fw->data) contains memory doesn't belong to firmware. there are two way to fix it.
1, copy builtin firmware to vmalloc memory, this is additional work to handle firmware. I create a wrap function for firmware request.
int request_XYZ_fw(const struct firmware **firmware_p, const char *name, struct device *device) { const struct firmware *fw; struct firmware *tmp; int ret;
ret = request_firmware(&fw, name, device);
if (ret < 0) return ret;
if (is_vmalloc_addr(fw->data)) *firmware_p = fw; else { tmp = (struct firmware *)kzalloc(sizeof(struct firmware), GFP_KERNEL); if (!tmp) return -ENOMEM; tmp->size = fw->size; tmp->data = vmalloc(fw->size); memcpy(tmp->data, fw->data, fw->size); *firmware_p = tmp; } return ret; }
2, make builtin firmware is also page alignment. the change in driver code is to check memory type of fw->data, and use different XXX_to_page function.
struct page *p; if (is_vmalloc_addr(fw->data)) // new p = vmalloc_to_page(fw->data); else // new p = virt_to_page(fw->data); // new
compare to solution, solution 2 is simple, this is what I said simplified. and solution 2 also save memory (I don't know the affect change memory alignment on memory usage.)
Hi, Greg is this easier for you to review?
BR. Ning. >
> Please fix this up submit this properly.
greg k-h | |