|
|
|
|
|
|
|
|
|
|
xen-ppc-devel
Re: [XenPPC] Xencomm virutal Adress translation question?
Ok, xencomm is simply a data structure that describes (we'll call it
the descriptor or "desc") the physical memory that another data
structure occupies (we'll call "data").
Sometimes this "data" is self described, such that all the data
exists on a single page, or proven to be physically contiguous, so it
is tagged as "inline" and no separate descriptor is necessary and
therefore no allocation (or free) is required, so lets only consider
when allocation is required.
There are two methods to create this desc: (1) _map_early() and (2)
_map().
_map_early() is used when allocation occurs from the stack and the
size of data is known to be a small number (less than 4) pages, this
is helpfull for performance and in cases where the allocator is
unavailable (too early or in interrupt). The descriptor returned
from this call does not require a corresponding free().
BTW: the above paragraph makes me want to rename _map_early() to
_map_auto() or _map_stack() which in an obvious manner explains why
no free() is needed. Hollis?
Now to answer your question:
In the case of _map(), if the data cannot be "inlined" then a single
kernel page is allocated to describe up to 511 (+-1) pages of data,
this page is known to easily be translated from kernel_virtual to
kernel_physycal using __va() and __pa() function, so there should be
no problem in using:
desc = __pa(alloc_page());
and:
free_page(__va(desc));
BTW: xencomm_pa(), should only be used when building the contents of
"desc" in order to describe "data", _not_ in creating the value of
"desc", that should always be __pa().
-JX
On Jan 27, 2007, at 8:13 PM, Jerone Young wrote:
I'm facing an interesting problem and I was wondering if anyone on the
list (Jimi) could answer it.
So in the xencomm patch that has been floating the list I have
functions
xencomm_map & xencomm_map_early . Now currently they return physcial
addresses regardless of the case. BUT, in the cases where they are not
inline I face a BIG problem. As I have no way to truly translate
back to
a virtual address to free the memory with xencomm_free (__va() isn't
going to cut it). So I currently have a patch (yet to go to the list)
that has xencomm_map & early returning a phyiscal address if it's
inline
and a virtual address if it is not.
Well then I have a hack in xencomm_vtop that says if the address
has bit
XENCOMM_INLINE_FLAG. Then just return the address, since you are
already
physical. So when xencomm_pa() is used within the code it will return
the proper address.
Is this acceptable? I'm not sure of any other way of going about this
since there is no good way to translate back to a virtual address
to use
xencomm_free.
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|
|
|
|
|