Hi, I would like to create a boot time variable i.e a variable that is set once at boot time. Variable does not need to be globally accessible. (actually I am using two variables). Could any one point me to examples of this already intree please? I have tried the following but it has a race condition on the zero check and assignment of randval/oddval. /* Maps a pointer to a unique identifier. */ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) { long hashval; static long randval = 0; static long oddval = 0; if (oddval == 0 && randval == 0) { randval = get_random_long(); oddval = get_random_odd_long(); } hashval = ptr_obfuscate((unsigned long)ptr, randval, oddval); spec.base = 16; return number(buf, end, hashval, spec); } And the compiler doesn't like static long randval = get_random_long(); static long oddval = get_random_odd_long(); I thought of wrapping oddval/randval in a struct and protecting it with a lock but I don't know how/where to initialize the lock in a race free manner? Any tips or pointers please? thanks, Tobin.
On Tue, Oct 10, 2017 at 10:17:09AM +1100, Tobin C. Harding wrote:
Hi,
I would like to create a boot time variable i.e a variable that is set once at boot time. Variable does not need to be globally accessible. (actually I am using two variables).
static foo = 42; should be all you need, right? If not, what exactly do you mean by "boot time variable"?
Could any one point me to examples of this already intree please?
I have tried the following but it has a race condition on the zero check and assignment of randval/oddval.
/* Maps a pointer to a unique identifier. */ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) { long hashval; static long randval = 0; static long oddval = 0;
if (oddval == 0 && randval == 0) { randval = get_random_long(); oddval = get_random_odd_long(); }
hashval = ptr_obfuscate((unsigned long)ptr, randval, oddval); spec.base = 16;
return number(buf, end, hashval, spec); }
What's wrong with this code?
And the compiler doesn't like
static long randval = get_random_long(); static long oddval = get_random_odd_long();
Yeah, that will not work, static initializers are at link/load time, not runtime.
I thought of wrapping oddval/randval in a struct and protecting it with a lock but I don't know how/where to initialize the lock in a race free manner?
Put a local lock in the function when testing if the variables are == 0, if you are worried that two different callers will enter it at the same time. hope this helps, greg k-h
On Tue, Oct 10, 2017 at 09:08:30AM +0200, Greg KH wrote:
On Tue, Oct 10, 2017 at 10:17:09AM +1100, Tobin C. Harding wrote:
Hi,
I would like to create a boot time variable i.e a variable that is set once at boot time. Variable does not need to be globally accessible. (actually I am using two variables).
static foo = 42;
should be all you need, right?
If not, what exactly do you mean by "boot time variable"?
Could any one point me to examples of this already intree please?
I have tried the following but it has a race condition on the zero check and assignment of randval/oddval.
/* Maps a pointer to a unique identifier. */ static char *ptr_to_id(char *buf, char *end, void *ptr, struct printf_spec spec) { long hashval; static long randval = 0; static long oddval = 0;
if (oddval == 0 && randval == 0) { randval = get_random_long(); oddval = get_random_odd_long(); }
hashval = ptr_obfuscate((unsigned long)ptr, randval, oddval); spec.base = 16;
return number(buf, end, hashval, spec); }
What's wrong with this code?
Maybe I just have race conditions on the brain.
And the compiler doesn't like
static long randval = get_random_long(); static long oddval = get_random_odd_long();
Yeah, that will not work, static initializers are at link/load time, not runtime.
I thought of wrapping oddval/randval in a struct and protecting it with a lock but I don't know how/where to initialize the lock in a race free manner?
Put a local lock in the function when testing if the variables are == 0, if you are worried that two different callers will enter it at the same time.
Okay.
hope this helps,
greg k-h
Cheers Greg
On Tue, 10 Oct 2017 10:17:09 +1100, "Tobin C. Harding" said:
I would like to create a boot time variable i.e a variable that is set once at boot time. Variable does not need to be globally accessible. (actually I am using two variables).
The canonical way to have stuff happen at boot is usually declaring an initcall.
how/where to initialize the lock in a race free manner?
Step 0: Figure out how once-at-boot code could *possibly* be called a second time. What are you worried about racing here?
participants (3)
-
Greg KH -
Tobin C. Harding -
valdis.kletnieks@vt.edu