Thread (18 messages) 18 messages, 3 authors, 2015-08-26

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help