*参照元 [#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_t size, int align) { 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 = slob_next(cur)) { - --[[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]