__cache_alloc

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi there again,

I've been trying to understand what's going on here but I'm not sure:

<mm/slab.c>
2047 static inline void * __cache_alloc (kmem_cache_t *cachep, int flags)
2048 {
2049         unsigned long save_flags;
2050         void* objp;
2051         struct array_cache *ac;
2052 
2053         cache_alloc_debugcheck_before(cachep, flags);
2054 
2055         local_irq_save(save_flags);
2056         ac = ac_data(cachep);
2057         if (likely(ac->avail)) {
2058                 STATS_INC_ALLOCHIT(cachep);
2059                 ac->touched = 1;
2060                 objp = ac_entry(ac)[--ac->avail];
2061         } else {
2062                 STATS_INC_ALLOCMISS(cachep);
2063                 objp = cache_alloc_refill(cachep, flags);
2064         }
2065         local_irq_restore(save_flags);
2066         objp = cache_alloc_debugcheck_after(cachep, flags, objp, 
__builtin_return_address(0));
2067         return objp;
2068 }

What puzzles me is line 2060: ac_entry(ac) returns (void **)(ac+1), which, if 
I see it correctly, returns a pointer to the next array_cache struct in the 
per CPU *array in the kmem_cache_t struct. But what exactly do the array 
subscript brackets after it do and an object pointer of what kind gets 
written in objp? --ac->avail decrements the count of available slab objects 
in the cache but (ac+1)[--ac->avail] returns the ac->touched of the previous 
array_cache struct which has just been set to 1 in the previous line. hmm, 
mighty strange ?!

Thanks in advance,
Boris.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.5 (GNU/Linux)

iD8DBQFBD2lkiBySr3Fn37QRAoCbAJ90mndQqkoACusdpYLgng3zdqvRYwCfV6QL
bPv2+7b8gp8uH7xPzejqftY=
=5Eik
-----END PGP SIGNATURE-----

--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux