lkml.org 
[lkml]   [1998]   [Sep]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe:Kernel programming Q: new aligned memory
From
>>>>> "B" == B James Phillippe <bryan@terran.org> writes:

B> Hello Kernel Gurus, I'm wondering what is the best way to align a
B> chunk of kernel memory (from kmalloc, say) on a particular byte
B> boundary. 16 bytes, for instance.

I had the same problem; however, I noticed everything was
using a power-of-two chunk allocation scheme, so I did a dirty
function [__usb_kmalloc_align]:

#define MAX_LEVELS 16

void* __usb_kmalloc_align_r (size_t size, int alignment,
int prio, int depth)
{
void *ptr, *rptr;

if (depth > MAX_LEVELS)
return NULL;

ptr = kmalloc (size < alignment? alignment : size, prio);
if (((unsigned long)ptr & (alignment-1)) != 0)
{
rptr = __usb_kmalloc_align_r (size, alignment, prio, depth+1);
usb_kfree (ptr);
ptr = rptr;
}

return ptr;
}

void* __usb_kmalloc_align (size_t size, int alignment, int prio)
{
void* ptr;
void* rptr;

ptr = kmalloc (size < alignment? alignment : size, prio);
if (((unsigned long)ptr & (alignment-1)) != 0)
{
rptr = __usb_kmalloc_align_r (size, alignment, prio, 0);
usb_kfree (ptr);
ptr = rptr;
}
return ptr;
}

The point is, if the size of the object is smaller then the
alignment, ask for a chunk sized as the alignment, else the size. The
rounding to the next power of two will do the same when
allocating.

I've successfully allocated _everyone_ of them, even under
heavy load, but I am not sure it will always success. So I implemented
a workaround for the case it failed.

If not aligned, it will recursively allocate more chunks,
until one falls into the wanted alignment; then it will free them and
let you with the aligned one. It's ugly, but it works. There's a depth
limit, just in case ...

It's dirty, could be optimized, etc, etc ... but hey, I did it
in five minutes :)

Linux-USB! http://peloncho.fis.ucm.es/~inaky/USB.html -
-
Inaky Perez Gonzalez -- PGP pubkey fingerprint -
inaky@peloncho.fis.ucm.es -- 8E 34 3A 62 64 99 E2 44 -
http://peloncho.fis.ucm.es/~inaky -- AD 7B 30 D9 DD FF 3E 4C -
--------------------------------- -- ----------------------- -
The loneliness of the long distance runner .....

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/faq.html

\
 
 \ /
  Last update: 2005-03-22 13:44    [W:0.053 / U:1.740 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site