linux-2.6.33/slob_page_alloc()
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*参照元 [#q8e1dab2]
#backlinks
*説明 [#x024a202]
-パス: [[linux-2.6.33/mm/slob.c]]
-FIXME: これは何?
--説明
**引数 [#u28e01da]
-struct slob_page *sp
--
--[[linux-2.6.33/slob_page]]
-size_t size
--
-int align
--
**返り値 [#hf0c9b79]
-void *
--
**参考 [#m982e660]
*実装 [#b90586d4]
/*
* Allocate a slob block within a given slob_page sp.
*/
static void *slob_page_alloc(struct slob_page *sp, size_...
{
slob_t *prev, *cur, *aligned = NULL;
int delta = 0, units = SLOB_UNITS(size);
-
--[[linux-2.6.33/slob_t]]
-
--[[linux-2.6.33/SLOB_UNITS()]]
for (prev = NULL, cur = sp->free; ; prev = cur, cur = s...
-
--[[linux-2.6.33/slob_next]]
slobidx_t avail = slob_units(cur);
-
--[[linux-2.6.33/slobidx_t]]
-
--[[linux-2.6.33/slob_units()]]
if (align) {
aligned = (slob_t *)ALIGN((unsigned long)cur, align);
delta = aligned - cur;
}
-
--[[linux-2.6.33/ALIGN()]]
if (avail >= units + delta) { /* room enough? */
slob_t *next;
if (delta) { /* need to fragment head to align? */
next = slob_next(cur);
set_slob(aligned, avail - delta, next);
set_slob(cur, delta, aligned);
prev = cur;
cur = aligned;
avail = slob_units(cur);
}
-
--[[linux-2.6.33/slob_next()]]
-
--[[linux-2.6.33/set_slob()]]
-
--[[linux-2.6.33/slob_units()]]
next = slob_next(cur);
if (avail == units) { /* exact fit? unlink. */
if (prev)
set_slob(prev, slob_units(prev), next);
else
sp->free = next;
} else { /* fragment */
if (prev)
set_slob(prev, slob_units(prev), cur + units);
else
sp->free = cur + units;
set_slob(cur + units, avail - units, next);
}
-
--[[linux-2.6.33/slob_next()]]
-
--[[linux-2.6.33/set_slob()]]
-
--[[linux-2.6.33/slob_units()]]
sp->units -= units;
if (!sp->units)
clear_slob_page_free(sp);
-
--[[linux-2.6.33/clear_slob_page_free()]]
return cur;
}
if (slob_last(cur))
return NULL;
-
--[[linux-2.6.33/slob_last()]]
}
}
*コメント [#i0dc82fe]
終了行:
*参照元 [#q8e1dab2]
#backlinks
*説明 [#x024a202]
-パス: [[linux-2.6.33/mm/slob.c]]
-FIXME: これは何?
--説明
**引数 [#u28e01da]
-struct slob_page *sp
--
--[[linux-2.6.33/slob_page]]
-size_t size
--
-int align
--
**返り値 [#hf0c9b79]
-void *
--
**参考 [#m982e660]
*実装 [#b90586d4]
/*
* Allocate a slob block within a given slob_page sp.
*/
static void *slob_page_alloc(struct slob_page *sp, size_...
{
slob_t *prev, *cur, *aligned = NULL;
int delta = 0, units = SLOB_UNITS(size);
-
--[[linux-2.6.33/slob_t]]
-
--[[linux-2.6.33/SLOB_UNITS()]]
for (prev = NULL, cur = sp->free; ; prev = cur, cur = s...
-
--[[linux-2.6.33/slob_next]]
slobidx_t avail = slob_units(cur);
-
--[[linux-2.6.33/slobidx_t]]
-
--[[linux-2.6.33/slob_units()]]
if (align) {
aligned = (slob_t *)ALIGN((unsigned long)cur, align);
delta = aligned - cur;
}
-
--[[linux-2.6.33/ALIGN()]]
if (avail >= units + delta) { /* room enough? */
slob_t *next;
if (delta) { /* need to fragment head to align? */
next = slob_next(cur);
set_slob(aligned, avail - delta, next);
set_slob(cur, delta, aligned);
prev = cur;
cur = aligned;
avail = slob_units(cur);
}
-
--[[linux-2.6.33/slob_next()]]
-
--[[linux-2.6.33/set_slob()]]
-
--[[linux-2.6.33/slob_units()]]
next = slob_next(cur);
if (avail == units) { /* exact fit? unlink. */
if (prev)
set_slob(prev, slob_units(prev), next);
else
sp->free = next;
} else { /* fragment */
if (prev)
set_slob(prev, slob_units(prev), cur + units);
else
sp->free = cur + units;
set_slob(cur + units, avail - units, next);
}
-
--[[linux-2.6.33/slob_next()]]
-
--[[linux-2.6.33/set_slob()]]
-
--[[linux-2.6.33/slob_units()]]
sp->units -= units;
if (!sp->units)
clear_slob_page_free(sp);
-
--[[linux-2.6.33/clear_slob_page_free()]]
return cur;
}
if (slob_last(cur))
return NULL;
-
--[[linux-2.6.33/slob_last()]]
}
}
*コメント [#i0dc82fe]
ページ名: