All of lore.kernel.org
 help / color / mirror / Atom feed
* boot time variable
@ 2017-10-09 23:17 Tobin C. Harding
  2017-10-10  7:08 ` Greg KH
  2017-10-10  7:50 ` valdis.kletnieks at vt.edu
  0 siblings, 2 replies; 4+ messages in thread
From: Tobin C. Harding @ 2017-10-09 23:17 UTC (permalink / raw)
  To: kernelnewbies

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.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* boot time variable
  2017-10-09 23:17 boot time variable Tobin C. Harding
@ 2017-10-10  7:08 ` Greg KH
  2017-10-10 10:33   ` Tobin C. Harding
  2017-10-10  7:50 ` valdis.kletnieks at vt.edu
  1 sibling, 1 reply; 4+ messages in thread
From: Greg KH @ 2017-10-10  7:08 UTC (permalink / raw)
  To: kernelnewbies

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

* boot time variable
  2017-10-09 23:17 boot time variable Tobin C. Harding
  2017-10-10  7:08 ` Greg KH
@ 2017-10-10  7:50 ` valdis.kletnieks at vt.edu
  1 sibling, 0 replies; 4+ messages in thread
From: valdis.kletnieks at vt.edu @ 2017-10-10  7:50 UTC (permalink / raw)
  To: kernelnewbies

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?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 486 bytes
Desc: not available
Url : http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20171010/35645399/attachment.bin 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* boot time variable
  2017-10-10  7:08 ` Greg KH
@ 2017-10-10 10:33   ` Tobin C. Harding
  0 siblings, 0 replies; 4+ messages in thread
From: Tobin C. Harding @ 2017-10-10 10:33 UTC (permalink / raw)
  To: kernelnewbies

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-10-10 10:33 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-10-09 23:17 boot time variable Tobin C. Harding
2017-10-10  7:08 ` Greg KH
2017-10-10 10:33   ` Tobin C. Harding
2017-10-10  7:50 ` valdis.kletnieks at vt.edu

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.