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

FreeBSD Manual Pages

  
 
  

home | help
rte_rcu_qsbr.h(3)		     DPDK		     rte_rcu_qsbr.h(3)

NAME
       rte_rcu_qsbr.h

SYNOPSIS
       #include	<inttypes.h>
       #include	<stdalign.h>
       #include	<stdbool.h>
       #include	<stdio.h>
       #include	<stdint.h>
       #include	<rte_common.h>
       #include	<rte_debug.h>
       #include	<rte_atomic.h>
       #include	<rte_ring.h>

   Data	Structures
       struct rte_rcu_qsbr_dq_parameters

   Macros
       #define RTE_RCU_QSBR_DQ_MT_UNSAFE   1

   Typedefs
       typedef void(* rte_rcu_qsbr_free_resource_t) (void *p, void *e,
	   unsigned int	n)

   Functions
       size_t rte_rcu_qsbr_get_memsize (uint32_t max_threads)
       int rte_rcu_qsbr_init (struct rte_rcu_qsbr *v, uint32_t max_threads)
       int rte_rcu_qsbr_thread_register	(struct	rte_rcu_qsbr *v, unsigned int
	   thread_id)
       int rte_rcu_qsbr_thread_unregister (struct rte_rcu_qsbr *v, unsigned
	   int thread_id)
       static __rte_always_inline void rte_rcu_qsbr_thread_online (struct
	   rte_rcu_qsbr	*v, unsigned int thread_id)
       static __rte_always_inline void rte_rcu_qsbr_thread_offline (struct
	   rte_rcu_qsbr	*v, unsigned int thread_id)
       static __rte_always_inline void rte_rcu_qsbr_lock (__rte_unused struct
	   rte_rcu_qsbr	*v, __rte_unused unsigned int thread_id)
       static __rte_always_inline void rte_rcu_qsbr_unlock (__rte_unused
	   struct rte_rcu_qsbr *v, __rte_unused	unsigned int thread_id)
       static __rte_always_inline uint64_t rte_rcu_qsbr_start (struct
	   rte_rcu_qsbr	*v)
       static __rte_always_inline void rte_rcu_qsbr_quiescent (struct
	   rte_rcu_qsbr	*v, unsigned int thread_id)
       static __rte_always_inline int rte_rcu_qsbr_check (struct rte_rcu_qsbr
	   *v, uint64_t	t, bool	wait)
       void rte_rcu_qsbr_synchronize (struct rte_rcu_qsbr *v, unsigned int
	   thread_id)
       int rte_rcu_qsbr_dump (FILE *f, struct rte_rcu_qsbr *v)
       struct rte_rcu_qsbr_dq *	rte_rcu_qsbr_dq_create (const struct
	   rte_rcu_qsbr_dq_parameters *params)
       int rte_rcu_qsbr_dq_enqueue (struct rte_rcu_qsbr_dq *dq,	void *e)
       int rte_rcu_qsbr_dq_reclaim (struct rte_rcu_qsbr_dq *dq,	unsigned int
	   n, unsigned int *freed, unsigned int	*pending, unsigned int
	   *available)
       int rte_rcu_qsbr_dq_delete (struct rte_rcu_qsbr_dq *dq)

Detailed Description
       RTE Quiescent State Based Reclamation (QSBR).

       Quiescent State (QS) is any point in the	thread execution where the
       thread does not hold a reference	to a data structure in shared memory.
       While using lock-less data structures, the writer can safely free
       memory once all the reader threads have entered quiescent state.

       This library provides the ability for the readers to report quiescent
       state and for the writers to identify when all the readers have entered
       quiescent state.

       Definition in file rte_rcu_qsbr.h.

Macro Definition Documentation
   #define RTE_RCU_QSBR_DQ_MT_UNSAFE   1
       Various flags supported.	< Enqueue and reclaim operations are multi-
       thread safe by default. The call	back functions registered to free the
       resources are assumed to	be multi-thread	safe. Set this flag if multi-
       thread safety is	not required.

       Definition at line 143 of file rte_rcu_qsbr.h.

Typedef	Documentation
   typedef void(* rte_rcu_qsbr_free_resource_t)	(void *p, void *e, unsigned
       int n)
       Call back function called to free the resources.

       Parameters
	   p Pointer provided while creating the defer queue
	   e Pointer to	the resource data stored on the	defer queue
	   n Number of resources to free. Currently, this is set to 1.

       Returns
	   None

       Definition at line 131 of file rte_rcu_qsbr.h.

Function Documentation
   size_t rte_rcu_qsbr_get_memsize (uint32_t max_threads)
       Return the size of the memory occupied by a Quiescent State variable.

       Parameters
	   max_threads Maximum number of threads reporting quiescent state on
	   this	variable.

       Returns
	   On success -	size of	memory in bytes	required for this QS variable.
	   On error - 1	with error code	set in rte_errno. Possible rte_errno
	   codes are:

	    EINVAL - max_threads is 0

   int rte_rcu_qsbr_init (struct rte_rcu_qsbr *	v, uint32_t max_threads)
       Initialize a Quiescent State (QS) variable.

       Parameters
	   v QS	variable
	   max_threads	Maximum	number of threads reporting quiescent state on
	   this	 variable.  This  should  be  the  same	 value	as  passed  to
	   rte_rcu_qsbr_get_memsize.

       Returns
	   On  success	-  0  On  error	 - 1 with error	code set in rte_errno.
	   Possible rte_errno codes are:

	    EINVAL - max_threads is 0 or 'v' is NULL.

   int rte_rcu_qsbr_thread_register (struct rte_rcu_qsbr  *  v,	 unsigned  int
       thread_id)
       Register	 a  reader  thread  to	report	its  quiescent	state  on a QS
       variable.

       This is implemented as a	lock-free function. It is  multi-thread	 safe.
       Any  reader  thread  that wants to report its quiescent state must call
       this API. This can be called during initialization or as	 part  of  the
       packet processing loop.

       Note  that  rte_rcu_qsbr_thread_online must be called before the	thread
       updates its quiescent state using rte_rcu_qsbr_quiescent.

       Parameters
	   v QS	variable
	   thread_id Reader  thread  with  this	 thread	 ID  will  report  its
	   quiescent  state on the QS variable.	thread_id is a value between 0
	   and (max_threads - 1). 'max_threads'	is  the	 parameter  passed  in
	   'rte_rcu_qsbr_init' API.

   int	rte_rcu_qsbr_thread_unregister	(struct	rte_rcu_qsbr * v, unsigned int
       thread_id)
       Remove a	reader thread,	from  the  list	 of  threads  reporting	 their
       quiescent state on a QS variable.

       This  is	 implemented as	a lock-free function. It is multi-thread safe.
       This API	can be called from the reader threads during shutdown. Ongoing
       quiescent state queries will stop waiting  for  the  status  from  this
       unregistered reader thread.

       Parameters
	   v QS	variable
	   thread_id Reader thread with	this thread ID will stop reporting its
	   quiescent state on the QS variable.

   static    __rte_always_inline   void	  rte_rcu_qsbr_thread_online   (struct
       rte_rcu_qsbr * v, unsigned int thread_id) [static]
       Add a registered	reader thread, to the list of threads reporting	 their
       quiescent state on a QS variable.

       This is implemented as a	lock-free function. It is multi-thread safe.

       Any  registered	reader thread that wants to report its quiescent state
       must call this API before calling rte_rcu_qsbr_quiescent. This  can  be
       called during initialization or as part of the packet processing	loop.

       The  reader  thread  must  call rte_rcu_qsbr_thread_offline API,	before
       calling any functions that block, to ensure that	rte_rcu_qsbr_check API
       does not	wait indefinitely for the reader thread	to update its QS.

       The reader  thread  must	 call  rte_rcu_thread_online  API,  after  the
       blocking	 function  call	returns, to ensure that	rte_rcu_qsbr_check API
       waits for the reader thread to update its quiescent state.

       Parameters
	   v QS	variable
	   thread_id Reader  thread  with  this	 thread	 ID  will  report  its
	   quiescent state on the QS variable.

       Definition at line 296 of file rte_rcu_qsbr.h.

   static   __rte_always_inline	  void	 rte_rcu_qsbr_thread_offline   (struct
       rte_rcu_qsbr * v, unsigned int thread_id) [static]
       Remove a	registered reader thread from the list	of  threads  reporting
       their quiescent state on	a QS variable.

       This is implemented as a	lock-free function. It is multi-thread safe.

       This  can  be  called  during  initialization  or as part of the	packet
       processing loop.

       The reader thread must  call  rte_rcu_qsbr_thread_offline  API,	before
       calling any functions that block, to ensure that	rte_rcu_qsbr_check API
       does not	wait indefinitely for the reader thread	to update its QS.

       Parameters
	   v QS	variable
	   thread_id  rte_rcu_qsbr_check  API  will  not  wait	for the	reader
	   thread with this thread ID to report	its quiescent state on the  QS
	   variable.

       Definition at line 349 of file rte_rcu_qsbr.h.

   static  __rte_always_inline	void  rte_rcu_qsbr_lock	 (__rte_unused	struct
       rte_rcu_qsbr * v, __rte_unused unsigned int thread_id) [static]
       Acquire a lock for accessing a shared data structure.

       This is implemented as a	lock-free function. It is multi-thread safe.

       This API	is provided to aid debugging. This  should  be	called	before
       accessing a shared data structure.

       When  RTE_LIBRTE_RCU_DEBUG  is  enabled	a lock counter is incremented.
       Similarly rte_rcu_qsbr_unlock will  decrement  the  counter.  When  the
       rte_rcu_qsbr_check API will verify that this counter is 0.

       When RTE_LIBRTE_RCU_DEBUG is disabled, this API will do nothing.

       Parameters
	   v QS	variable
	   thread_id Reader thread id

       Definition at line 386 of file rte_rcu_qsbr.h.

   static  __rte_always_inline	void  rte_rcu_qsbr_unlock (__rte_unused	struct
       rte_rcu_qsbr * v, __rte_unused unsigned int thread_id) [static]
       Release a lock after accessing a	shared data structure.

       This is implemented as a	lock-free function. It is multi-thread safe.

       This API	is provided to aid debugging.  This  should  be	 called	 after
       accessing a shared data structure.

       When   RTE_LIBRTE_RCU_DEBUG   is	  enabled,   rte_rcu_qsbr_unlock  will
       decrement a lock	counter. rte_rcu_qsbr_check API	will verify that  this
       counter is 0.

       When RTE_LIBRTE_RCU_DEBUG is disabled, this API will do nothing.

       Parameters
	   v QS	variable
	   thread_id Reader thread id

       Definition at line 419 of file rte_rcu_qsbr.h.

   static __rte_always_inline uint64_t rte_rcu_qsbr_start (struct rte_rcu_qsbr
       * v) [static]
       Ask the reader threads to report	the quiescent state status.

       This  is	 implemented  as a lock-free function. It is multi-thread safe
       and can be called from worker threads.

       Parameters
	   v QS	variable

       Returns

	    This is the token for this	call of	the API. This should be	passed
	     to	rte_rcu_qsbr_check API.

       Definition at line 449 of file rte_rcu_qsbr.h.

   static __rte_always_inline void rte_rcu_qsbr_quiescent (struct rte_rcu_qsbr
       * v, unsigned int thread_id) [static]
       Update quiescent	state for a reader thread.

       This is implemented as a	lock-free function. It is  multi-thread	 safe.
       All  the	 reader	 threads registered to report their quiescent state on
       the QS variable must call this API.

       Parameters
	   v QS	variable
	   thread_id Update the	quiescent  state  for  the  reader  with  this
	   thread ID.

       Definition at line 478 of file rte_rcu_qsbr.h.

   static __rte_always_inline int rte_rcu_qsbr_check (struct rte_rcu_qsbr * v,
       uint64_t	t, bool	wait) [static]
       Checks  if  all	the  reader  threads  have entered the quiescent state
       referenced by token.

       This is implemented as a	lock-free function. It	is  multi-thread  safe
       and can be called from the worker threads as well.

       If  this	 API  is called	with 'wait' set	to true, the following factors
       must be considered:

       1) If the calling thread	is also	reporting the status on	 the  same  QS
       variable,  it  must  update  the	quiescent state	status,	before calling
       this API.

       2) In addition, while calling from multiple threads, only one of	 those
       threads	can  be	 reporting  the	 quiescent  state status on a given QS
       variable.

       Parameters
	   v QS	variable
	   t Token returned by rte_rcu_qsbr_start API
	   wait	If true, block till all	 the  reader  threads  have  completed
	   entering the	quiescent state	referenced by token 't'.

       Returns

	    0	if all reader threads have NOT passed through specified	number
	     of	quiescent states.

	    1 if all reader threads have passed through specified  number  of
	     quiescent states.

       Definition at line 665 of file rte_rcu_qsbr.h.

   void	 rte_rcu_qsbr_synchronize  (struct  rte_rcu_qsbr  *  v,	 unsigned  int
       thread_id)
       Wait till the reader threads have entered quiescent state.

       This is implemented as a	lock-free function. It is  multi-thread	 safe.
       This  API  can be thought of as a wrapper around	rte_rcu_qsbr_start and
       rte_rcu_qsbr_check APIs.

       If this API is called from multiple threads, only one of	those  threads
       can be reporting	the quiescent state status on a	given QS variable.

       Parameters
	   v QS	variable
	   thread_id  Thread  ID  of  the caller if it is registered to	report
	   quiescent state on this QS variable (i.e.  the  calling  thread  is
	   also	  part	of  the	 readside  critical  section).	If  not,  pass
	   RTE_QSBR_THRID_INVALID.

   int rte_rcu_qsbr_dump (FILE * f, struct rte_rcu_qsbr	* v)
       Dump the	details	of a single QS variables to a file.

       It is NOT multi-thread safe.

       Parameters
	   f A pointer to a file for output
	   v QS	variable

       Returns
	   On success -	0 On error - 1	with  error  code  set	in  rte_errno.
	   Possible rte_errno codes are:

	    EINVAL - NULL parameters are passed

   struct    rte_rcu_qsbr_dq	*    rte_rcu_qsbr_dq_create    (const	struct
       rte_rcu_qsbr_dq_parameters * params)
       Create a	queue used to store the	data structure elements	 that  can  be
       freed later. This queue is referred to as 'defer	queue'.

       Parameters
	   params Parameters to	create a defer queue.

       Returns
	   On  success - Valid pointer to defer	queue On error - NULL Possible
	   rte_errno codes are:

	    EINVAL - NULL parameters are passed

	    ENOMEM - Not enough memory

   int rte_rcu_qsbr_dq_enqueue (struct rte_rcu_qsbr_dq * dq, void * e)
       Enqueue one resource to the defer queue and start the grace period. The
       resource	will be	freed later after at least one grace period is over.

       If the defer queue is full, it will attempt to  reclaim	resources.  It
       will  also  reclaim  resources  at regular intervals to avoid the defer
       queue from growing too big.

       Multi-thread safety is provided as the defer queue configuration.  When
       multi-thread safety is requested, it is possible	that the resources are
       not  stored in their order of deletion. This results in resources being
       held in the defer queue longer than they	should.

       Parameters
	   dq Defer queue to allocate an entry from.
	   e Pointer to	resource data to copy to the defer queue. The size  of
	   the	data  to  copy	is equal to the	element	size provided when the
	   defer queue was created.

       Returns
	   On success -	0 On error - 1 with rte_errno set to

	    EINVAL - NULL parameters are passed

	    ENOSPC - Defer queue is full. This	condition can  not  happen  if
	     the  defer	 queue	size  is  equal	(or larger) than the number of
	     elements in the data structure.

   int rte_rcu_qsbr_dq_reclaim (struct rte_rcu_qsbr_dq * dq, unsigned  int  n,
       unsigned	int * freed, unsigned int * pending, unsigned int * available)

       Free resources from the defer queue.

       This API	is multi-thread	safe.

       Parameters
	   dq Defer queue to free an entry from.
	   n Maximum number of resources to free.
	   freed Number	of resources that were freed.
	   pending Number of resources pending on the defer queue. This	number
	   might not be	accurate if multi-thread safety	is configured.
	   available Number of resources that can be added to the defer	queue.
	   This	 number	 might	not  be	 accurate  if  multi-thread  safety is
	   configured.

       Returns
	   On successful reclamation of	at least 1 resource - 0	On error  -  1
	   with	rte_errno set to

	    EINVAL - NULL parameters are passed

   int rte_rcu_qsbr_dq_delete (struct rte_rcu_qsbr_dq *	dq)
       Delete a	defer queue.

       It tries	to reclaim all the resources on	the defer queue. If any	of the
       resources have not completed the	grace period the reclamation stops and
       returns	immediately.  The  rest	of the resources are not reclaimed and
       the defer queue is not freed.

       Parameters
	   dq Defer queue to delete.

       Returns
	   On success -	0 On error - 1 Possible	rte_errno codes	are:

	    EAGAIN - Some of the resources have  not  completed  at  least  1
	     grace period, try again.

Author
       Generated automatically by Doxygen for DPDK from	the source code.

Version	25.11.0			Thu Jun	11 2026		     rte_rcu_qsbr.h(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=RTE_RCU_QSBR_DQ_MT_UNSAFE&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help