iPXE
Data Structures | Macros | Functions | Variables
ib_pathrec.c File Reference

Infiniband path lookups. More...

#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <byteswap.h>
#include <errno.h>
#include <ipxe/infiniband.h>
#include <ipxe/ib_mi.h>
#include <ipxe/ib_pathrec.h>

Go to the source code of this file.

Data Structures

struct  ib_cached_path
 A cached path. More...
 

Macros

#define IB_NUM_CACHED_PATHS   4
 Number of path cache entries. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void ib_path_complete (struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx, int rc, union ib_mad *mad, struct ib_address_vector *av __unused)
 Handle path transaction completion. More...
 
struct ib_pathib_create_path (struct ib_device *ibdev, struct ib_address_vector *av, struct ib_path_operations *op)
 Create path. More...
 
void ib_destroy_path (struct ib_device *ibdev, struct ib_path *path)
 Destroy path. More...
 
static struct ib_cached_pathib_find_path_cache_entry (struct ib_device *ibdev, union ib_gid *dgid)
 Find path cache entry. More...
 
static void ib_cached_path_complete (struct ib_device *ibdev, struct ib_path *path, int rc, struct ib_address_vector *av __unused)
 Handle cached path transaction completion. More...
 
int ib_resolve_path (struct ib_device *ibdev, struct ib_address_vector *av)
 Resolve path. More...
 

Variables

static struct ib_mad_transaction_operations ib_path_op
 Path transaction completion operations. More...
 
static struct ib_cached_path ib_path_cache [IB_NUM_CACHED_PATHS]
 Path cache. More...
 
static unsigned int ib_path_cache_idx
 Oldest path cache entry index. More...
 
static struct ib_path_operations ib_cached_path_op
 Cached path transaction completion operations. More...
 

Detailed Description

Infiniband path lookups.

Definition in file ib_pathrec.c.

Macro Definition Documentation

◆ IB_NUM_CACHED_PATHS

#define IB_NUM_CACHED_PATHS   4

Number of path cache entries.

Must be a power of two.

Definition at line 167 of file ib_pathrec.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ ib_path_complete()

static void ib_path_complete ( struct ib_device ibdev,
struct ib_mad_interface mi,
struct ib_mad_transaction madx,
int  rc,
union ib_mad mad,
struct ib_address_vector *av  __unused 
)
static

Handle path transaction completion.

Parameters
ibdevInfiniband device
miManagement interface
madxManagement transaction
rcStatus code
madReceived MAD (or NULL on error)
avSource address vector (or NULL on error)

Definition at line 51 of file ib_pathrec.c.

55  {
56  struct ib_path *path = ib_madx_get_ownerdata ( madx );
57  union ib_gid *dgid = &path->av.gid;
58  struct ib_path_record *pathrec = &mad->sa.sa_data.path_record;
59 
60  /* Report failures */
61  if ( ( rc == 0 ) && ( mad->hdr.status != htons ( IB_MGMT_STATUS_OK ) ))
62  rc = -ENETUNREACH;
63  if ( rc != 0 ) {
64  DBGC ( ibdev, "IBDEV %s path lookup for " IB_GID_FMT
65  " failed: %s\n",
66  ibdev->name, IB_GID_ARGS ( dgid ), strerror ( rc ) );
67  goto out;
68  }
69 
70  /* Extract values from MAD */
71  path->av.lid = ntohs ( pathrec->dlid );
72  path->av.sl = ( pathrec->reserved__sl & 0x0f );
73  path->av.rate = ( pathrec->rate_selector__rate & 0x3f );
74  DBGC ( ibdev, "IBDEV %s path to " IB_GID_FMT " lid %d sl %d rate "
75  "%d\n", ibdev->name, IB_GID_ARGS ( dgid ), path->av.lid,
76  path->av.sl, path->av.rate );
77 
78  /* Use only the LID if no GRH is needed for this path */
79  if ( memcmp ( &path->av.gid.s.prefix, &ibdev->gid.s.prefix,
80  sizeof ( path->av.gid.s.prefix ) ) == 0 ) {
81  path->av.gid_present = 0;
82  }
83 
84  out:
85  /* Destroy the completed transaction */
86  ib_destroy_madx ( ibdev, mi, madx );
87  path->madx = NULL;
88 
89  /* Hand off to upper completion handler */
90  path->op->complete ( ibdev, path, rc, &path->av );
91 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An Infiniband path.
Definition: ib_pathrec.h:32
char name[IBDEV_NAME_LEN]
Name of this Infiniband device.
Definition: infiniband.h:408
union ib_gid gid
Port GID (comprising GID prefix and port GUID)
Definition: infiniband.h:441
#define DBGC(...)
Definition: compiler.h:505
void(* complete)(struct ib_device *ibdev, struct ib_path *path, int rc, struct ib_address_vector *av)
Handle path transaction completion.
Definition: ib_pathrec.h:26
#define ntohs(value)
Definition: byteswap.h:136
unsigned int gid_present
GID is present.
Definition: infiniband.h:90
An Infiniband Global Identifier.
Definition: ib_packet.h:33
__be32 out[4]
Definition: CIB_PRM.h:36
enum ib_rate rate
Rate.
Definition: infiniband.h:86
struct ib_mad_transaction * madx
Management transaction.
Definition: ib_pathrec.h:38
union ib_sa_data sa_data
Definition: ib_mad.h:600
uint8_t reserved__sl
Definition: ib_mad.h:251
struct ib_gid::@559 s
uint8_t rate_selector__rate
Definition: ib_mad.h:253
struct ib_address_vector av
Address vector.
Definition: ib_pathrec.h:36
#define IB_GID_ARGS(gid)
Infiniband Global Identifier debug message arguments.
Definition: ib_packet.h:48
union ib_guid prefix
Definition: ib_packet.h:39
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
uint16_t dlid
Definition: ib_mad.h:246
struct ib_path_record path_record
Definition: ib_mad.h:299
struct ib_mad_sa sa
Definition: ib_mad.h:613
static __always_inline void * ib_madx_get_ownerdata(struct ib_mad_transaction *madx)
Get Infiniband management transaction owner-private data.
Definition: ib_mi.h:117
union ib_gid dgid
Definition: ib_mad.h:12
unsigned int sl
Service level.
Definition: infiniband.h:88
struct ib_mad_hdr hdr
Definition: ib_mad.h:611
#define IB_MGMT_STATUS_OK
Definition: ib_mad.h:580
union ib_gid gid
GID, if present.
Definition: infiniband.h:92
#define IB_GID_FMT
Infiniband Global Identifier debug message format.
Definition: ib_packet.h:45
struct ib_path_operations * op
Path operations.
Definition: ib_pathrec.h:40
unsigned int lid
Local ID.
Definition: infiniband.h:81
#define ENETUNREACH
Network unreachable.
Definition: errno.h:488
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define htons(value)
Definition: byteswap.h:135
union ib_mad mad
Definition: arbel.h:12
uint16_t status
Definition: ib_mad.h:543
void ib_destroy_madx(struct ib_device *ibdev __unused, struct ib_mad_interface *mi __unused, struct ib_mad_transaction *madx)
Destroy management transaction.
Definition: ib_mi.c:327

References ib_path::av, ib_path_operations::complete, DBGC, dgid, ib_path_record::dlid, ENETUNREACH, ib_address_vector::gid, ib_device::gid, ib_address_vector::gid_present, ib_mad::hdr, htons, ib_destroy_madx(), IB_GID_ARGS, IB_GID_FMT, ib_madx_get_ownerdata(), IB_MGMT_STATUS_OK, ib_address_vector::lid, mad, ib_path::madx, memcmp(), ib_device::name, ntohs, NULL, ib_path::op, out, ib_sa_data::path_record, ib_gid::prefix, ib_address_vector::rate, ib_path_record::rate_selector__rate, rc, ib_path_record::reserved__sl, ib_gid::s, ib_mad::sa, ib_mad_sa::sa_data, ib_address_vector::sl, ib_mad_hdr::status, and strerror().

◆ ib_create_path()

struct ib_path* ib_create_path ( struct ib_device ibdev,
struct ib_address_vector av,
struct ib_path_operations op 
)

Create path.

Parameters
ibdevInfiniband device
avAddress vector to complete
opPath operations
Return values
pathPath

Definition at line 107 of file ib_pathrec.c.

108  {
109  struct ib_path *path;
110  union ib_mad mad;
111  struct ib_mad_sa *sa = &mad.sa;
112 
113  /* Allocate and initialise structure */
114  path = zalloc ( sizeof ( *path ) );
115  if ( ! path )
116  goto err_alloc_path;
117  path->ibdev = ibdev;
118  memcpy ( &path->av, av, sizeof ( path->av ) );
119  path->op = op;
120 
121  /* Construct path request */
122  memset ( sa, 0, sizeof ( *sa ) );
123  sa->mad_hdr.mgmt_class = IB_MGMT_CLASS_SUBN_ADM;
124  sa->mad_hdr.class_version = IB_SA_CLASS_VERSION;
125  sa->mad_hdr.method = IB_MGMT_METHOD_GET;
126  sa->mad_hdr.attr_id = htons ( IB_SA_ATTR_PATH_REC );
127  sa->sa_hdr.comp_mask[1] =
129  memcpy ( &sa->sa_data.path_record.dgid, &path->av.gid,
130  sizeof ( sa->sa_data.path_record.dgid ) );
131  memcpy ( &sa->sa_data.path_record.sgid, &ibdev->gid,
132  sizeof ( sa->sa_data.path_record.sgid ) );
133 
134  /* Create management transaction */
135  path->madx = ib_create_madx ( ibdev, ibdev->gsi, &mad, NULL,
136  &ib_path_op );
137  if ( ! path->madx )
138  goto err_create_madx;
139  ib_madx_set_ownerdata ( path->madx, path );
140 
141  return path;
142 
143  ib_destroy_madx ( ibdev, ibdev->gsi, path->madx );
144  err_create_madx:
145  free ( path );
146  err_alloc_path:
147  return NULL;
148 }
#define IB_SA_CLASS_VERSION
Definition: ib_mad.h:207
#define IB_MGMT_METHOD_GET
Definition: ib_mad.h:569
An Infiniband path.
Definition: ib_pathrec.h:32
union ib_gid gid
Port GID (comprising GID prefix and port GUID)
Definition: infiniband.h:441
struct ib_mad_interface * gsi
General services interface.
Definition: infiniband.h:461
struct ib_device * ibdev
Infiniband device.
Definition: ib_pathrec.h:34
#define htonl(value)
Definition: byteswap.h:133
struct ib_mad_transaction * madx
Management transaction.
Definition: ib_pathrec.h:38
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static struct ib_mad_transaction_operations ib_path_op
Path transaction completion operations.
Definition: ib_pathrec.c:94
struct ib_mad_transaction * ib_create_madx(struct ib_device *ibdev, struct ib_mad_interface *mi, union ib_mad *mad, struct ib_address_vector *av, struct ib_mad_transaction_operations *op)
Create management transaction.
Definition: ib_mi.c:287
struct sockaddr sa
Definition: syslog.c:55
static __always_inline void ib_madx_set_ownerdata(struct ib_mad_transaction *madx, void *priv)
Set Infiniband management transaction owner-private data.
Definition: ib_mi.h:106
struct ib_address_vector av
Address vector.
Definition: ib_pathrec.h:36
#define IB_SA_ATTR_PATH_REC
Definition: ib_mad.h:223
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:624
struct ib_mad_sa sa
Definition: ib_mad.h:613
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
#define IB_MGMT_CLASS_SUBN_ADM
Definition: ib_mad.h:557
union ib_gid gid
GID, if present.
Definition: infiniband.h:92
A management datagram.
Definition: ib_mad.h:610
struct ib_path_operations * op
Path operations.
Definition: ib_pathrec.h:40
#define IB_SA_PATH_REC_DGID
Definition: ib_mad.h:258
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
A subnet administration MAD.
Definition: ib_mad.h:596
#define htons(value)
Definition: byteswap.h:135
union ib_mad mad
Definition: arbel.h:12
#define IB_SA_PATH_REC_SGID
Definition: ib_mad.h:259
void ib_destroy_madx(struct ib_device *ibdev __unused, struct ib_mad_interface *mi __unused, struct ib_mad_transaction *madx)
Destroy management transaction.
Definition: ib_mi.c:327
void * memset(void *dest, int character, size_t len) __nonnull

References ib_path::av, free, ib_address_vector::gid, ib_device::gid, ib_device::gsi, htonl, htons, ib_create_madx(), ib_destroy_madx(), ib_madx_set_ownerdata(), IB_MGMT_CLASS_SUBN_ADM, IB_MGMT_METHOD_GET, ib_path_op, IB_SA_ATTR_PATH_REC, IB_SA_CLASS_VERSION, IB_SA_PATH_REC_DGID, IB_SA_PATH_REC_SGID, ib_path::ibdev, mad, ib_path::madx, memcpy(), memset(), NULL, ib_path::op, op, ib_mad::sa, sa, and zalloc().

Referenced by ib_create_conn(), and ib_resolve_path().

◆ ib_destroy_path()

void ib_destroy_path ( struct ib_device ibdev,
struct ib_path path 
)

Destroy path.

Parameters
ibdevInfiniband device
pathPath

Definition at line 156 of file ib_pathrec.c.

156  {
157 
158  if ( path->madx )
159  ib_destroy_madx ( ibdev, ibdev->gsi, path->madx );
160  free ( path );
161 }
struct ib_mad_interface * gsi
General services interface.
Definition: infiniband.h:461
struct ib_mad_transaction * madx
Management transaction.
Definition: ib_pathrec.h:38
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:54
void ib_destroy_madx(struct ib_device *ibdev __unused, struct ib_mad_interface *mi __unused, struct ib_mad_transaction *madx)
Destroy management transaction.
Definition: ib_mi.c:327

References free, ib_device::gsi, ib_destroy_madx(), and ib_path::madx.

Referenced by ib_cached_path_complete(), ib_cm_path_complete(), ib_create_conn(), ib_destroy_conn(), and ib_resolve_path().

◆ ib_find_path_cache_entry()

static struct ib_cached_path* ib_find_path_cache_entry ( struct ib_device ibdev,
union ib_gid dgid 
)
static

Find path cache entry.

Parameters
ibdevInfiniband device
dgidDestination GID
Return values
pathPath cache entry, or NULL

Definition at line 189 of file ib_pathrec.c.

189  {
190  struct ib_cached_path *cached;
191  unsigned int i;
192 
193  for ( i = 0 ; i < IB_NUM_CACHED_PATHS ; i++ ) {
194  cached = &ib_path_cache[i];
195  if ( ! cached->path )
196  continue;
197  if ( cached->path->ibdev != ibdev )
198  continue;
199  if ( memcmp ( &cached->path->av.gid, dgid,
200  sizeof ( cached->path->av.gid ) ) != 0 )
201  continue;
202  return cached;
203  }
204 
205  return NULL;
206 }
struct ib_path * path
Path.
Definition: ib_pathrec.c:172
struct ib_device * ibdev
Infiniband device.
Definition: ib_pathrec.h:34
A cached path.
Definition: ib_pathrec.c:170
#define IB_NUM_CACHED_PATHS
Number of path cache entries.
Definition: ib_pathrec.c:167
static struct ib_cached_path ib_path_cache[IB_NUM_CACHED_PATHS]
Path cache.
Definition: ib_pathrec.c:176
struct ib_address_vector av
Address vector.
Definition: ib_pathrec.h:36
union ib_gid dgid
Definition: ib_mad.h:12
union ib_gid gid
GID, if present.
Definition: infiniband.h:92
int memcmp(const void *first, const void *second, size_t len)
Compare memory regions.
Definition: string.c:114
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References ib_path::av, dgid, ib_address_vector::gid, IB_NUM_CACHED_PATHS, ib_path_cache, ib_path::ibdev, memcmp(), NULL, and ib_cached_path::path.

Referenced by ib_resolve_path().

◆ ib_cached_path_complete()

static void ib_cached_path_complete ( struct ib_device ibdev,
struct ib_path path,
int  rc,
struct ib_address_vector *av  __unused 
)
static

Handle cached path transaction completion.

Parameters
ibdevInfiniband device
pathPath
rcStatus code
avAddress vector, or NULL on error

Definition at line 216 of file ib_pathrec.c.

218  {
219  struct ib_cached_path *cached = ib_path_get_ownerdata ( path );
220 
221  /* If the transaction failed, erase the cache entry */
222  if ( rc != 0 ) {
223  /* Destroy the old cache entry */
224  ib_destroy_path ( ibdev, path );
225  memset ( cached, 0, sizeof ( *cached ) );
226  return;
227  }
228 
229  /* Do not destroy the completed transaction; we still need to
230  * refer to the resolved path.
231  */
232 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
struct ib_path * path
Path.
Definition: ib_pathrec.c:172
A cached path.
Definition: ib_pathrec.c:170
static __always_inline void * ib_path_get_ownerdata(struct ib_path *path)
Get Infiniband path owner-private data.
Definition: ib_pathrec.h:63
void ib_destroy_path(struct ib_device *ibdev, struct ib_path *path)
Destroy path.
Definition: ib_pathrec.c:156
void * memset(void *dest, int character, size_t len) __nonnull

References ib_destroy_path(), ib_path_get_ownerdata(), memset(), ib_cached_path::path, and rc.

◆ ib_resolve_path()

int ib_resolve_path ( struct ib_device ibdev,
struct ib_address_vector av 
)

Resolve path.

Parameters
ibdevInfiniband device
avAddress vector to complete
Return values
rcReturn status code

This provides a non-transactional way to resolve a path, via a cache similar to ARP.

Definition at line 249 of file ib_pathrec.c.

249  {
250  union ib_gid *gid = &av->gid;
251  struct ib_cached_path *cached;
252  unsigned int cache_idx;
253 
254  /* Look in cache for a matching entry */
255  cached = ib_find_path_cache_entry ( ibdev, gid );
256  if ( cached && cached->path->av.lid ) {
257  /* Populated entry found */
258  av->lid = cached->path->av.lid;
259  av->rate = cached->path->av.rate;
260  av->sl = cached->path->av.sl;
261  av->gid_present = cached->path->av.gid_present;
262  DBGC2 ( ibdev, "IBDEV %s cache hit for " IB_GID_FMT "\n",
263  ibdev->name, IB_GID_ARGS ( gid ) );
264  return 0;
265  }
266  DBGC ( ibdev, "IBDEV %s cache miss for " IB_GID_FMT "%s\n", ibdev->name,
267  IB_GID_ARGS ( gid ), ( cached ? " (in progress)" : "" ) );
268 
269  /* If lookup is already in progress, do nothing */
270  if ( cached )
271  return -ENOENT;
272 
273  /* Locate a new cache entry to use */
274  cache_idx = ( (ib_path_cache_idx++) % IB_NUM_CACHED_PATHS );
275  cached = &ib_path_cache[cache_idx];
276 
277  /* Destroy the old cache entry */
278  if ( cached->path )
279  ib_destroy_path ( ibdev, cached->path );
280  memset ( cached, 0, sizeof ( *cached ) );
281 
282  /* Create new path */
283  cached->path = ib_create_path ( ibdev, av, &ib_cached_path_op );
284  if ( ! cached->path ) {
285  DBGC ( ibdev, "IBDEV %s could not create path\n",
286  ibdev->name );
287  return -ENOMEM;
288  }
289  ib_path_set_ownerdata ( cached->path, cached );
290 
291  /* Not found yet */
292  return -ENOENT;
293 }
char name[IBDEV_NAME_LEN]
Name of this Infiniband device.
Definition: infiniband.h:408
struct ib_path * path
Path.
Definition: ib_pathrec.c:172
static struct ib_path_operations ib_cached_path_op
Cached path transaction completion operations.
Definition: ib_pathrec.c:235
#define DBGC(...)
Definition: compiler.h:505
#define ENOENT
No such file or directory.
Definition: errno.h:514
static unsigned int ib_path_cache_idx
Oldest path cache entry index.
Definition: ib_pathrec.c:179
unsigned int gid_present
GID is present.
Definition: infiniband.h:90
An Infiniband Global Identifier.
Definition: ib_packet.h:33
static __always_inline void ib_path_set_ownerdata(struct ib_path *path, void *priv)
Set Infiniband path owner-private data.
Definition: ib_pathrec.h:52
enum ib_rate rate
Rate.
Definition: infiniband.h:86
A cached path.
Definition: ib_pathrec.c:170
#define IB_NUM_CACHED_PATHS
Number of path cache entries.
Definition: ib_pathrec.c:167
#define ENOMEM
Not enough space.
Definition: errno.h:534
static struct ib_cached_path ib_path_cache[IB_NUM_CACHED_PATHS]
Path cache.
Definition: ib_pathrec.c:176
struct ib_address_vector av
Address vector.
Definition: ib_pathrec.h:36
struct ib_path * ib_create_path(struct ib_device *ibdev, struct ib_address_vector *av, struct ib_path_operations *op)
Create path.
Definition: ib_pathrec.c:107
#define IB_GID_ARGS(gid)
Infiniband Global Identifier debug message arguments.
Definition: ib_packet.h:48
static struct ib_cached_path * ib_find_path_cache_entry(struct ib_device *ibdev, union ib_gid *dgid)
Find path cache entry.
Definition: ib_pathrec.c:189
unsigned int sl
Service level.
Definition: infiniband.h:88
#define DBGC2(...)
Definition: compiler.h:522
union ib_gid gid
GID, if present.
Definition: infiniband.h:92
#define IB_GID_FMT
Infiniband Global Identifier debug message format.
Definition: ib_packet.h:45
unsigned int lid
Local ID.
Definition: infiniband.h:81
void ib_destroy_path(struct ib_device *ibdev, struct ib_path *path)
Destroy path.
Definition: ib_pathrec.c:156
u8 gid[16]
Definition: CIB_PRM.h:31
void * memset(void *dest, int character, size_t len) __nonnull

References ib_path::av, DBGC, DBGC2, ENOENT, ENOMEM, gid, ib_address_vector::gid, ib_address_vector::gid_present, ib_cached_path_op, ib_create_path(), ib_destroy_path(), ib_find_path_cache_entry(), IB_GID_ARGS, IB_GID_FMT, IB_NUM_CACHED_PATHS, ib_path_cache, ib_path_cache_idx, ib_path_set_ownerdata(), ib_address_vector::lid, memset(), ib_device::name, ib_cached_path::path, ib_address_vector::rate, and ib_address_vector::sl.

Referenced by eoib_duplicate(), eoib_tx_av(), and ipoib_transmit().

Variable Documentation

◆ ib_path_op

struct ib_mad_transaction_operations ib_path_op
static
Initial value:
= {
.complete = ib_path_complete,
}
static void ib_path_complete(struct ib_device *ibdev, struct ib_mad_interface *mi, struct ib_mad_transaction *madx, int rc, union ib_mad *mad, struct ib_address_vector *av __unused)
Handle path transaction completion.
Definition: ib_pathrec.c:51

Path transaction completion operations.

Definition at line 94 of file ib_pathrec.c.

Referenced by ib_create_path().

◆ ib_path_cache

struct ib_cached_path ib_path_cache[IB_NUM_CACHED_PATHS]
static

Path cache.

Definition at line 176 of file ib_pathrec.c.

Referenced by ib_find_path_cache_entry(), and ib_resolve_path().

◆ ib_path_cache_idx

unsigned int ib_path_cache_idx
static

Oldest path cache entry index.

Definition at line 179 of file ib_pathrec.c.

Referenced by ib_resolve_path().

◆ ib_cached_path_op

struct ib_path_operations ib_cached_path_op
static
Initial value:
= {
}
static void ib_cached_path_complete(struct ib_device *ibdev, struct ib_path *path, int rc, struct ib_address_vector *av __unused)
Handle cached path transaction completion.
Definition: ib_pathrec.c:216

Cached path transaction completion operations.

Definition at line 235 of file ib_pathrec.c.

Referenced by ib_resolve_path().