Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
UNR(9)			   Kernel Developer's Manual			UNR(9)

NAME
       new_unrhdr,   clean_unrhdr,   clear_unrhdr,  delete_unrhdr,  alloc_unr,
       alloc_unr_specific,    free_unr,	   create_iter_unr,	next_iter_unr,
       free_iter_unr --	kernel unit number allocator

SYNOPSIS
       #include	<sys/systm.h>

       struct unrhdr *
       new_unrhdr(int low, int high, struct mtx	*mutex);

       void
       clean_unrhdr(struct unrhdr *uh);

       void
       clean_unrhdrl(struct unrhdr *uh);

       void
       clear_unrhdr(struct unrhdr *uh);

       void
       delete_unrhdr(struct unrhdr *uh);

       int
       alloc_unr(struct	unrhdr *uh);

       int
       alloc_unrl(struct unrhdr	*uh);

       int
       alloc_unr_specific(struct unrhdr	*uh, u_int item);

       void
       free_unr(struct unrhdr *uh, u_int item);

       void *
       create_iter_unr(struct unrhdr *uh);

       int
       next_iter_unr(void *handle);

       void
       free_iter_unr(void *handle);

DESCRIPTION
       The kernel unit number allocator	is a generic facility, which allows to
       allocate	unit numbers within a specified	range.

       new_unrhdr(low, high, mutex)
	       Initialize  a  new  unit	 number	allocator entity.  The low and
	       high arguments specify minimum and maximum number of unit  num-
	       bers.   There is	no cost	associated with	the range of unit num-
	       bers, so	unless the resource really is finite, INT_MAX  can  be
	       used.   If mutex	is not NULL, it	is used	for locking when allo-
	       cating and freeing units.  If the passed	 value	is  the	 token
	       UNR_NO_MTX,  then no locking is applied internally.  Otherwise,
	       internal	mutex is used.

       clear_unrhdr(uh)
	       Clear all units from the	specified unit	number	allocator  en-
	       tity.   This function resets the	entity as if it	were just ini-
	       tialized	with new_unrhdr().

       delete_unrhdr(uh)
	       Delete specified	unit number allocator entity.	This  function
	       frees  the  memory associated with the entity, it does not free
	       any units.  To free all units use clear_unrhdr().

       clean_unrhdr(uh)
	       Freeing unit numbers might result in some internal  memory  be-
	       coming  unused.	There are unit allocator consumers that	cannot
	       tolerate	taking malloc(9) locks to free the memory, while  hav-
	       ing  their unit mutex locked.  For this reason, free of the un-
	       used memory after delete	is postponed until  the	 consumer  can
	       afford	 calling   into	  the	malloc(9)   subsystem.	  Call
	       clean_unrhdr(uh)	to do the cleanup.  In particular, this	 needs
	       to  be  done before freeing a unr, if a deletion	of units could
	       have been performed.

       clean_unrhdrl()
	       Same as clean_unrhdr(), but assumes that	the unr	mutex  is  al-
	       ready owned, if any.

       alloc_unr(uh)
	       Return a	new unit number.  The lowest free number is always al-
	       located.	  This	function  does	not  allocate memory and never
	       sleeps, however it may block on a mutex.	 If no free unit  num-
	       bers are	left, -1 is returned.

       alloc_unrl(uh)
	       Same  as	alloc_unr() except that	mutex is assumed to be already
	       locked and thus is not used.

       alloc_unr_specific(uh, item)
	       Allocate	a specific unit	number.	 This function allocates  mem-
	       ory  and	thus may sleep.	 The allocated unit number is returned
	       on success.  If the specified number is	already	 allocated  or
	       out of the range, -1 is returned.

       free_unr(uh, item)
	       Free a previously allocated unit	number.	 This function may re-
	       quire  allocating  memory,  and thus it can sleep.  There is no
	       pre-locked variant.

ITERATOR INTERFACE
       The unr facility	provides an interface to iterate  over	all  allocated
       units for the given unrhdr.  Iterators are identified by	an opaque han-
       dle.   More than	one iterators can operate simultaneously; the iterator
       position	data is	recorded only in the iterator handle.

       Consumers must ensure that the unit allocator is	not  modified  between
       calls to	the iterator functions.	 In particular,	the internal allocator
       mutex  cannot  provide  consistency, because it is acquired and dropped
       inside the next_iter_unr() function.  If	the allocator was modified, it
       is safe to free the iterator with free_iter_unr() method	nevertheless.

       create_iter_unr(uh)
	       Create an iterator.  Return the handle that should be passed to
	       other iterator functions.

       next_iter_unr(handle)
	       Return the value	of the next unit.  Units are returned  in  as-
	       cending order.  A return	value of -1 indicates the end of iter-
	       ation, in which case -1 is returned for all future calls.

       free_iter_unr(handle)
	       Free the	iterator, handle is no longer valid.

CODE REFERENCES
       The above functions are implemented in sys/kern/subr_unit.c.

HISTORY
       Kernel unit number allocator first appeared in FreeBSD 6.0.

AUTHORS
       Kernel  unit  number  allocator was written by Poul-Henning Kamp.  This
       manpage was written by Gleb Smirnoff.

FreeBSD	13.2			April 21, 2022				UNR(9)

NAME | SYNOPSIS | DESCRIPTION | ITERATOR INTERFACE | CODE REFERENCES | HISTORY | AUTHORS

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=alloc_unr_specific&sektion=9&manpath=FreeBSD+14.0-RELEASE+and+Ports>

home | help