I have a question about the function spinlock_check()
used in spin_lock_init()
macro.
The code of spinlock_check
is written below and it returns address of rlock
static __always_inline raw_spinlock_t *spinlock_check(spinlock_t *lock)
{
return &lock->rlock;
}
It is used in the macro spin_lock_init
. The code of this macro:
#define spin_lock_init(_lock) \
do { \
spinlock_check(_lock); \
raw_spin_lock_init(&(_lock)->rlock); \
} while (0)
I saw a question about this topic in here. But i did not quite understand and I want to express doubts in my way.
The spin_lock_init()
is a macro but spinlock_check()
isnt a macro. Its an inline function. So I think there is no way for some compilation magic to happen here but I expect some magic during execution of those instructions.
What effect does spinlock_check()
has?
Because nothing is using the return value of spinlock_check()
function.
Even though spinlock_check()
return something the next step is going to get executed anyways.
Because I saw its usage in one of the file and I thought that its different from min(x, y) macro.
Here is the usage which I found
#ifdef CONFIG_NUMA
static void do_numa_crng_init(struct work_struct *work)
{
int i;
struct crng_state *crng;
struct crng_state **pool;
pool = kcalloc(nr_node_ids, sizeof(*pool), GFP_KERNEL|__GFP_NOFAIL);
for_each_online_node(i) {
crng = kmalloc_node(sizeof(struct crng_state),
GFP_KERNEL | __GFP_NOFAIL, i);
spin_lock_init(&crng->lock);
crng_initialize(crng);
pool[i] = crng;
}
mb();
if (cmpxchg(&crng_node_pool, NULL, pool)) {
for_each_node(i)
kfree(pool[i]);
kfree(pool);
}
}
So here crng
is dynamically allocated one. say I have missed the kmalloc
code meaning I haven't allocated memory for crng
but still I used the macro spin_lock_init(crng).
Now what good the spinlock_check()
function does ?
Isn't it that after spinlock_check()
function raw_spin_lock_init
automatically executes ?
If it is going to execute then whats the use of spinlock_check()
function?
There should be some meaning but I can't figure it out.