在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()的作用是什么,也不知道它如何找到下一个免费的平板。
最佳答案
看来struct slab *slabp
是struct slab
的数组。因此,(slabp + 1)
中的slab_bufctl()
仅返回slabp
旁边的元素。
另外,由于slab_bufctl()
返回的元素为kmem_bufctl_t *
,以后可以作为数组访问,因此我认为我们可以对struct slab
进行如下宽松定义:
struct slab {
kmem_bufctl_t *_name;
}