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

  
 
  

home | help
fi_eq(3)			Libfabric v1.15.1			fi_eq(3)

NAME
     fi_eq - Event queue operations

     fi_eq_open / fi_close
	    Open/close an event queue

     fi_control
	    Control operation of EQ

     fi_eq_read / fi_eq_readerr
	    Read an event from an event queue

     fi_eq_write
	    Writes an event to an event queue

     fi_eq_sread
	    A synchronous (blocking) read of an event queue

     fi_eq_strerror
	    Converts provider specific error information into a printable string

SYNOPSIS
	    #include <rdma/fi_domain.h>

	    int fi_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
		struct fid_eq **eq, void *context);

	    int fi_close(struct fid *eq);

	    int fi_control(struct fid *eq, int command, void *arg);

	    ssize_t fi_eq_read(struct fid_eq *eq, uint32_t *event,
		void *buf, size_t len, uint64_t flags);

	    ssize_t fi_eq_readerr(struct fid_eq *eq, struct fi_eq_err_entry *buf,
		uint64_t flags);

	    ssize_t fi_eq_write(struct fid_eq *eq, uint32_t event,
		const void *buf, size_t len, uint64_t flags);

	    ssize_t fi_eq_sread(struct fid_eq *eq, uint32_t *event,
		void *buf, size_t len, int timeout, uint64_t flags);

	    const char * fi_eq_strerror(struct fid_eq *eq, int prov_errno,
		  const void *err_data, char *buf, size_t len);

ARGUMENTS
     fabric
	    Opened fabric descriptor

     eq     Event queue

     attr   Event queue attributes

     context
	    User specified context associated with the event queue.

     event  Reported event

     buf    For  read  calls,  the  data buffer to write events into.  For write
	    calls, an event to insert into the event queue.  For fi_eq_strerror,
	    an optional buffer that receives printable error information.

     len    Length of data buffer

     flags  Additional flags to apply to the operation

     command
	    Command of control operation to perform on EQ.

     arg    Optional control argument

     prov_errno
	    Provider specific error value

     err_data
	    Provider specific error data related to a completion

     timeout
	    Timeout specified in milliseconds

DESCRIPTION
     Event queues are used to report events associated with control  operations.
     They  are	associated with memory registration, address vectors, connection
     management, and fabric and domain level events.  Reported events are either
     associated with a requested operation or affiliated with a call that regis-
     ters for specific types of events, such as  listening  for  connection  re-
     quests.

   fi_eq_open
     fi_eq_open allocates a new event queue.

     The  properties  and  behavior  of  an  event  queue  are defined by struct
     fi_eq_attr.

	    struct fi_eq_attr {
		size_t		     size;	/* # entries for EQ */
		uint64_t	     flags;	/* operation flags */
		enum fi_wait_obj     wait_obj;	/* requested wait object */
		int		     signaling_vector; /* interrupt affinity */
		struct fid_wait     *wait_set;	/* optional wait set */
	    };

     size   Specifies the minimum size of an event queue.

     flags  Flags that control the configuration of the EQ.

     - FI_WRITE
	    Indicates that the application requires support for  inserting  user
	    events into the EQ.  If this flag is set, then the fi_eq_write oper-
	    ation  must  be  supported by the provider.  If the FI_WRITE flag is
	    not set, then the application may not invoke fi_eq_write.

     - FI_AFFINITY
	    Indicates that the signaling_vector field (see below) is valid.

     wait_obj
	    EQ's may be associated with a specific wait  object.   Wait  objects
	    allow applications to block until the wait object is signaled, indi-
	    cating that an event is available to be read.  Users may use fi_con-
	    trol  to  retrieve the underlying wait object associated with an EQ,
	    in order to use it in other system calls.  The following values  may
	    be used to specify the type of wait object associated with an EQ:

     - FI_WAIT_NONE
	    Used  to  indicate that the user will not block (wait) for events on
	    the EQ.  When FI_WAIT_NONE is specified,  the  application	may  not
	    call  fi_eq_sread.	 This is the default is no wait object is speci-
	    fied.

     - FI_WAIT_UNSPEC
	    Specifies that the user will only wait on the EQ using fabric inter-
	    face calls, such as  fi_eq_sread.	In  this  case,  the  underlying
	    provider  may select the most appropriate or highest performing wait
	    object available, including custom	wait  mechanisms.   Applications
	    that select FI_WAIT_UNSPEC are not guaranteed to retrieve the under-
	    lying wait object.

     - FI_WAIT_SET
	    Indicates  that the event queue should use a wait set object to wait
	    for events.  If specified, the wait_set field must reference an  ex-
	    isting wait set object.

     - FI_WAIT_FD
	    Indicates that the EQ should use a file descriptor as its wait mech-
	    anism.   A	file  descriptor  wait	object must be usable in select,
	    poll, and epoll routines.  However, a provider may signal an FD wait
	    object by marking it as readable or with an error.

     - FI_WAIT_MUTEX_COND
	    Specifies that the EQ should use a pthread mutex and  cond	variable
	    as a wait object.

     - FI_WAIT_YIELD
	    Indicates  that  the  EQ will wait without a wait object but instead
	    yield on every wait.  Allows usage of fi_eq_sread through a spin.

     signaling_vector
	    If the FI_AFFINITY flag is set, this indicates the logical cpu  num-
	    ber  (0..max  cpu - 1) that interrupts associated with the EQ should
	    target.  This field should be treated as a hint to the provider  and
	    may be ignored if the provider does not support interrupt affinity.

     wait_set
	    If	wait_obj  is FI_WAIT_SET, this field references a wait object to
	    which the event queue should attach.  When an event is inserted into
	    the event queue, the corresponding wait set will be signaled if  all
	    necessary  conditions are met.  The use of a wait_set enables an op-
	    timized method of waiting for events across multiple  event  queues.
	    This field is ignored if wait_obj is not FI_WAIT_SET.

   fi_close
     The  fi_close  call  releases all resources associated with an event queue.
     Any events which remain on the EQ when it is closed are lost.

     The EQ must not be bound to any other objects prior to being closed, other-
     wise the call will return -FI_EBUSY.

   fi_control
     The fi_control call is used to access provider or	implementation	specific
     details  of  the event queue.  Access to the EQ should be serialized across
     all calls when fi_control is invoked, as it may redirect the implementation
     of EQ operations.	The following control commands are usable with an EQ.

     FI_GETWAIT (void **)
	    This command allows the user to retrieve the low-level  wait  object
	    associated	with the EQ.  The format of the wait-object is specified
	    during EQ creation, through the EQ attributes.  The  fi_control  arg
	    parameter  should be an address where a pointer to the returned wait
	    object will be written.  This should be an 'int *'	for  FI_WAIT_FD,
	    or `struct fi_mutex_cond' for FI_WAIT_MUTEX_COND.

	    struct fi_mutex_cond {
		pthread_mutex_t     *mutex;
		pthread_cond_t	    *cond;
	    };

   fi_eq_read
     The  fi_eq_read  operations performs a non-blocking read of event data from
     the EQ.  The format of the event data is based on the  type  of  event  re-
     trieved  from  the  EQ,  with all events starting with a struct fi_eq_entry
     header.  At most one event will be returned per  EQ  read	operation.   The
     number  of  bytes	successfully read from the EQ is returned from the read.
     The FI_PEEK flag may be used to indicate that event  data	should	be  read
     from  the EQ without being consumed.  A subsequent read without the FI_PEEK
     flag would then remove the event from the EQ.

     The following types of events may be reported to an EQ, along with informa-
     tion regarding the format associated with each event.

     Asynchronous Control Operations
	    Asynchronous control operations are basic requests that simply  need
	    to	generate  an  event to indicate that they have completed.  These
	    include the following types of events: memory registration,  address
	    vector resolution, and multicast joins.

     Control  requests report their completion by inserting a struct   fi_eq_en-
     try into the EQ.  The format of this structure is:

	    struct fi_eq_entry {
		fid_t		 fid;	     /* fid associated with request */
		void		*context;    /* operation context */
		uint64_t	 data;	     /* completion-specific data */
	    };

     For the completion of basic asynchronous control operations,  the	returned
     event will indicate the operation that has completed, and the fid will ref-
     erence  the fabric descriptor associated with the event.  For memory regis-
     tration, this will be an FI_MR_COMPLETE event and the fid_mr.  Address res-
     olution will reference an FI_AV_COMPLETE event and fid_av.  Multicast joins
     will report an FI_JOIN_COMPLETE and fid_mc.  The context field will be  set
     to  the context specified as part of the operation, if available, otherwise
     the context will be associated with the fabric descriptor.  The data  field
     will  be set as described in the man page for the corresponding object type
     (e.g., see fi_av(3) for a description of how  asynchronous  address  vector
     insertions are completed).

     Connection Notification
	    Connection	notifications  are  connection	management notifications
	    used to setup or tear down connections between endpoints.  There are
	    three connection notification events: FI_CONNREQ, FI_CONNECTED,  and
	    FI_SHUTDOWN.   Connection  notifications  are  reported using struct
	    fi_eq_cm_entry:

	    struct fi_eq_cm_entry {
		fid_t		 fid;	     /* fid associated with request */
		struct fi_info	*info;	     /* endpoint information */
		uint8_t 	data[];     /* app connection data */
	    };

     A connection request (FI_CONNREQ) event indicates that  a	remote	endpoint
     wishes  to establish a new connection to a listening, or passive, endpoint.
     The fid is the passive endpoint.  Information regarding the requested,  ac-
     tive  endpoint's  capabilities  and  attributes are available from the info
     field.  The application is responsible for freeing this structure by  call-
     ing  fi_freeinfo  when  it  is no longer needed.  The fi_info connreq field
     will reference the connection request associated with this event.	 To  ac-
     cept  a connection, an endpoint must first be created by passing an fi_info
     structure referencing this connreq field to fi_endpoint().   This	endpoint
     is  then passed to fi_accept() to complete the acceptance of the connection
     attempt.  Creating the endpoint is most easily accomplished by passing  the
     fi_info  returned	as part of the CM event into fi_endpoint().  If the con-
     nection is to be rejected, the connreq is passed to fi_reject().

     Any application data exchanged as part of the connection request is  placed
     beyond  the  fi_eq_cm_entry structure.  The amount of data available is ap-
     plication dependent and limited to the buffer space provided by the  appli-
     cation  when fi_eq_read is called.  The amount of returned data may be cal-
     culated using the return value to fi_eq_read.  Note that the amount of  re-
     turned  data  is  limited	by  the  underlying connection protocol, and the
     length of any data returned may include protocol padding.	As a result, the
     returned length may be larger than that specified by the connecting peer.

     If a connection request has been accepted, an FI_CONNECTED  event	will  be
     generated	on  both  sides  of  the connection.  The active side - one that
     called fi_connect() - may receive user data as  part  of  the  FI_CONNECTED
     event.   The  user  data is passed to the connection manager on the passive
     side through the fi_accept call.  User data is not provided with an FI_CON-
     NECTED event on the listening side of the connection.

     Notification that a remote peer has disconnected from an active endpoint is
     done through the FI_SHUTDOWN  event.   Shutdown  notification  uses  struct
     fi_eq_cm_entry  as  declared above.  The fid field for a shutdown notifica-
     tion refers to the active endpoint's fid_ep.

     Asynchronous Error Notification
	    Asynchronous errors are used to  report  problems  with  fabric  re-
	    sources.   Reported  errors  may be fatal or transient, based on the
	    error, and result in the resource becoming disabled.   Disabled  re-
	    sources  will  fail operations submitted against them until they are
	    explicitly re-enabled by the application.

     Asynchronous errors may be reported for completion queues and endpoints  of
     all  types.   CQ  errors  can result when resource management has been dis-
     abled, and the provider has detected a queue overrun.  Endpoint errors  may
     be result of numerous actions, but are often associated with a failed oper-
     ation.   Operations  may  fail  because of buffer overruns, invalid permis-
     sions, incorrect memory access  keys,  network  routing  failures,  network
     reach-ability issues, etc.

     Asynchronous  errors  are reported using struct fi_eq_err_entry, as defined
     below.  The fabric descriptor (fid) associated with the error  is	provided
     as  part  of  the error data.  An error code is also available to determine
     the cause of the error.

   fi_eq_sread
     The fi_eq_sread  call  is	the  blocking  (or  synchronous)  equivalent  to
     fi_eq_read.   It  behaves is similar to the non-blocking call, with the ex-
     ception that the calls will not return until either an event has been  read
     from  the	EQ or an error or timeout occurs.  Specifying a negative timeout
     means an infinite timeout.

     Threads blocking in this function will return to the  caller  if  they  are
     signaled by some external source.	This is true even if the timeout has not
     occurred or was specified as infinite.

     It  is  invalid  for  applications to call this function if the EQ has been
     configured with a wait object of FI_WAIT_NONE or FI_WAIT_SET.

   fi_eq_readerr
     The read error function, fi_eq_readerr, retrieves information regarding any
     asynchronous operation  which  has  completed  with  an  unexpected  error.
     fi_eq_readerr  is a non-blocking call, returning immediately whether an er-
     ror completion was found or not.

     EQs are optimized to report operations which have	completed  successfully.
     Operations  which fail are reported `out of band'.  Such operations are re-
     trieved using the fi_eq_readerr function.	When an operation that completes
     with an unexpected error is inserted into an EQ, it is placed into a tempo-
     rary error queue.	Attempting to read from an EQ while an item  is  in  the
     error queue results in an FI_EAVAIL failure.  Applications may use this re-
     turn code to determine when to call fi_eq_readerr.

     Error  information  is reported to the user through struct fi_eq_err_entry.
     The format of this structure is defined below.

	    struct fi_eq_err_entry {
		fid_t		 fid;	     /* fid associated with error */
		void		*context;    /* operation context */
		uint64_t	 data;	     /* completion-specific data */
		int		 err;	     /* positive error code */
		int		 prov_errno; /* provider error code */
		void		*err_data;   /* additional error data */
		size_t		 err_data_size; /* size of err_data */
	    };

     The fid will reference the fabric descriptor  associated  with  the  event.
     For  memory  registration, this will be the fid_mr, address resolution will
     reference a fid_av, and CM events will refer  to  a  fid_ep.   The  context
     field will be set to the context specified as part of the operation.

     The data field will be set as described in the man page for the correspond-
     ing  object  type (e.g., see fi_av(3) for a description of how asynchronous
     address vector insertions are completed).

     The general reason for  the  error  is  provided  through	the  err  field.
     Provider  or  operational	specific error information may also be available
     through the prov_errno and err_data fields.  Users may call  fi_eq_strerror
     to  convert provider specific error information into a printable string for
     debugging purposes.

     On input, err_data_size indicates the size of the err_data buffer in bytes.
     On output, err_data_size will be set to the number of bytes copied  to  the
     err_data	buffer.    The	err_data  information  is  typically  used  with
     fi_eq_strerror to provide details about the type of error that occurred.

     For compatibility purposes, if err_data_size is 0 on input, or  the  fabric
     was  opened with release < 1.5, err_data will be set to a data buffer owned
     by the provider.  The contents of the buffer will remain valid until a sub-
     sequent read call against the EQ.	Applications must  serialize  access  to
     the  EQ  when  processing	errors	to  ensure that the buffer referenced by
     err_data does not change.

EVENT FIELDS
     The EQ entry data structures share many of the same fields.   The	meanings
     are the same or similar for all EQ structure formats, with specific details
     described below.

     fid    This corresponds to the fabric descriptor associated with the event.
	    The type of fid depends on the event being reported.  For FI_CONNREQ
	    this  will	be  the  fid  of the passive endpoint.	FI_CONNECTED and
	    FI_SHUTDOWN will reference the active endpoint.  FI_MR_COMPLETE  and
	    FI_AV_COMPLETE will refer to the MR or AV fabric descriptor, respec-
	    tively.  FI_JOIN_COMPLETE will point to the multicast descriptor re-
	    turned  as	part  of  the  join  operation.   Applications	can  use
	    fid->context value to retrieve the context associated with the  fab-
	    ric descriptor.

     context
	    The context value is set to the context parameter specified with the
	    operation  that generated the event.  If no context parameter is as-
	    sociated with the operation, this field will be NULL.

     data   Data is an operation specific value or set of bytes.  For connection
	    events, data is application data exchanged as part of the connection
	    protocol.

     err    This err code is a positive fabric errno associated with  an  event.
	    The  err value indicates the general reason for an error, if one oc-
	    curred.  See fi_errno.3 for a list of possible error codes.

     prov_errno
	    On an error, prov_errno may contain a provider specific error  code.
	    The  use  of this field and its meaning is provider specific.  It is
	    intended to be used as a debugging aid.  See fi_eq_strerror for  ad-
	    ditional  details  on converting this error value into a human read-
	    able string.

     err_data
	    On an error, err_data may reference a provider  specific  amount  of
	    data  associated with an error.  The use of this field and its mean-
	    ing is provider specific.  It is intended to be used as a  debugging
	    aid.   See	fi_eq_strerror for additional details on converting this
	    error data into a human readable string.

     err_data_size
	    On input, err_data_size indicates the size of the err_data buffer in
	    bytes.  On output, err_data_size will be set to the number of  bytes
	    copied  to	the  err_data buffer.  The err_data information is typi-
	    cally used with fi_eq_strerror to provide details about the type  of
	    error that occurred.

     For  compatibility  purposes, if err_data_size is 0 on input, or the fabric
     was opened with release < 1.5, err_data will be set to a data buffer  owned
     by the provider.  The contents of the buffer will remain valid until a sub-
     sequent  read  call  against the EQ.  Applications must serialize access to
     the EQ when processing errors to  ensure  that  the  buffer  referenced  by
     err_data does no change.

NOTES
     If  an  event  queue  has been overrun, it will be placed into an `overrun'
     state.  Write operations against an overrun EQ will fail with -FI_EOVERRUN.
     Read operations will continue to return any valid, non-corrupted events, if
     available.  After all valid events have been retrieved, any attempt to read
     the EQ will result in it returning an  FI_EOVERRUN  error	event.	 Overrun
     event  queues are considered fatal and may not be used to report additional
     events once the overrun occurs.

RETURN VALUES
     fi_eq_open
	    Returns 0 on success.  On error, a negative value  corresponding  to
	    fabric errno is returned.

     fi_eq_read / fi_eq_readerr
	    On	success,  returns the number of bytes read from the event queue.
	    On error, a negative value corresponding  to  fabric  errno  is  re-
	    turned.   If  no  data is available to be read from the event queue,
	    -FI_EAGAIN is returned.

     fi_eq_sread
	    On success, returns the number of bytes read from the  event  queue.
	    On	error,	a  negative  value  corresponding to fabric errno is re-
	    turned.  If the timeout expires or the calling  thread  is	signaled
	    and no data is available to be read from the event queue, -FI_EAGAIN
	    is returned.

     fi_eq_write
	    On	success, returns the number of bytes written to the event queue.
	    On error, a negative value corresponding  to  fabric  errno  is  re-
	    turned.

     fi_eq_strerror
	    Returns  a	character string interpretation of the provider specific
	    error returned with a completion.

     Fabric errno values are defined in rdma/fi_errno.h.

SEE ALSO
     fi_getinfo(3), fi_endpoint(3), fi_domain(3), fi_cntr(3), fi_poll(3)

AUTHORS
     OpenFabrics.

Libfabric Programmer's Manual	   2021-03-22				fi_eq(3)

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

home | help