0

在 Linux 内核中,我们在 mm/slab.c 中有一个函数

static void *slab_get_obj(struct kmem_cache *cachep, struct slab
*slabp,
                                int nodeid) {
        void *objp = index_to_obj(cachep, slabp, slabp->free);
        kmem_bufctl_t next;

        slabp->inuse++;
        next = slab_bufctl(slabp)[slabp->free];
#if DEBUG
        slab_bufctl(slabp)[slabp->free] = BUFCTL_FREE;
        WARN_ON(slabp->nodeid != nodeid);
#endif
        slabp->free = next;

        return objp; }

在哪里,

static inline kmem_bufctl_t *slab_bufctl(struct slab *slabp)
{
        return (kmem_bufctl_t *) (slabp + 1);
}

我不明白slab_bufctl() 做了什么或者它如何找到下一个空闲的slab。

4

1 回答 1

0

似乎struct slab *slabp是一个数组struct slab。因此,(slabp + 1)inslab_bufctl()只返回 旁边的元素slabp

另外,由于slab_bufctl()返回元素 as kmem_bufctl_t *,稍后作为数组访问,我认为我们可以有一个松散的定义struct slab如下:

struct slab {
    kmem_bufctl_t *_name;
}
于 2013-06-19T08:35:34.323 回答