RE: [PATCH v6 3/3] qe_common: add qe_muram_ functions to manage muram
From: Zhao Qiang <hidden>
Date: 2015-08-25 07:34:56
Also in:
lkml
On 08/25/2015 12:15 PM, Laura Abbott wrote
-----Original Message----- From: Laura Abbott [mailto:labbott@redhat.com] Sent: Tuesday, August 25, 2015 12:15 PM To: Zhao Qiang-B45475; Wood Scott-B07421 Cc: linux-kernel@vger.kernel.org; linuxppc-dev@lists.ozlabs.org; lauraa@codeaurora.org; Xie Xiaobo-R63061; benh@kernel.crashing.org; Li Yang-Leo-R58472; paulus@samba.org Subject: Re: [PATCH v6 3/3] qe_common: add qe_muram_ functions to manage muram =20 On 08/24/2015 08:03 PM, Zhao Qiang wrote:quoted
quoted
-----Original Message----- From: Laura Abbott [mailto:labbott@redhat.com] Sent: Tuesday, August 25, 2015 7:32 AM To: Zhao Qiang-B45475; Wood Scott-B07421 Cc: linux-kernel@vger.kernel.org; linuxppc-dev@lists.ozlabs.org; lauraa@codeaurora.org; Xie Xiaobo-R63061; benh@kernel.crashing.org; Li Yang-Leo-R58472; paulus@samba.org Subject: Re: [PATCH v6 3/3] qe_common: add qe_muram_ functions to manage muram On 08/24/2015 02:31 AM, Zhao Qiang wrote:quoted
+out: + of_node_put(np); + return ret; +} + +/** + * qe_muram_alloc - allocate the requested size worth of multi-user +ram + * @size: number of bytes to allocate + * @align: requested alignment, in bytes + * + * This function returns an offset into the muram area. + * Use qe_dpram_addr() to get the virtual address of the area. + * Use qe_muram_free() to free the allocation. + */ +unsigned long qe_muram_alloc(unsigned long size, unsigned long +align) { + unsigned long start; + unsigned long flags; + struct muram_block *entry; + + spin_lock_irqsave(&qe_muram_lock, flags); + muram_pool_data.align =3D align; + start =3D gen_pool_alloc(muram_pool, size);The advantage of creating gen_pool_alloc_data was so that you could pass in the align automatically without having to modify the structure=
.
quoted
quoted
Is there a reason you aren't using that?quoted
+ memset(qe_muram_addr(start), 0, size);There doesn't seem to be a check for allocation failure from the gen_alloc.gen_pool_alloc will return 0 if there is error, but if the address returned is just 0x0, it can't distinguish it is address or error.=20 Yes, that's a bad limitation of gen_pool. Maybe one day that will get fixed. In a previous out of tree driver, I worked around this by offsetting the gen_pool_add by a constant so any return value was non-zero and out of memory was zero and then subtracting the constant off of the return value=
.
Not sure if that's better or worse than just fixing gen_alloc. =20
The workaround works for non alignment allocation, but for alignment alloca= tion, It need to align bytes to addr 0, offsetting the gen_pool_add maybe make wr= ong alignment .
=20 Thanks, Laura