Skip to content

Commit

Permalink
fabric: Add ability to duplicate a fid_nic
Browse files Browse the repository at this point in the history
Add a function that will allocated/duplicate a struct
fid_nic.  This may be used by providers to copy a fid_nic.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
  • Loading branch information
shefty committed Sep 25, 2018
1 parent 6fe80eb commit 84fdc85
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/ofi.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ void ofi_free_filter(struct fi_filter *filter);
int ofi_apply_filter(struct fi_filter *filter, const char *name);

int ofi_nic_close(struct fid *fid);
struct fid_nic *ofi_nic_dup(const struct fid_nic *nic);

void fi_log_init(void);
void fi_log_fini(void);
Expand Down
11 changes: 11 additions & 0 deletions include/ofi_mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,17 @@ static inline void *mem_dup(const void *src, size_t size)
return dest;
}

static inline int str_dup(const char *src, char **dst)
{
if (src) {
*dst = strdup(src);
if (!*dst)
return -FI_ENOMEM;
} else {
*dst = NULL;
}
return 0;
}

/*
* Buffer pool (free stack) template
Expand Down
81 changes: 80 additions & 1 deletion src/fabric.c
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,86 @@ int ofi_nic_close(struct fid *fid)
return 0;
}

struct fi_ops default_nic_ops = {
.size = sizeof(struct fi_ops),
.close = ofi_nic_close,
};

static int ofi_dup_dev_attr(const struct fi_device_attr *attr,
struct fi_device_attr *dup_attr)
{
if (str_dup(attr->name, &dup_attr->name) ||
str_dup(attr->device_id, &dup_attr->device_id) ||
str_dup(attr->device_version, &dup_attr->device_version) ||
str_dup(attr->vendor_id, &dup_attr->vendor_id) ||
str_dup(attr->driver, &dup_attr->driver) ||
str_dup(attr->firmware, &dup_attr->firmware))
return -FI_ENOMEM;

return 0;
}

static int ofi_dup_link_attr(const struct fi_link_attr *attr,
struct fi_link_attr *dup_attr)
{
if (str_dup(attr->address, &dup_attr->address) ||
str_dup(attr->network_type, &dup_attr->network_type))
return -FI_ENOMEM;

dup_attr->mtu = attr->mtu;
dup_attr->speed = attr->speed;
dup_attr->state = attr->state;
return 0;
}

struct fid_nic *ofi_nic_dup(const struct fid_nic *nic)
{
struct fid_nic *dup_nic;
int ret;

dup_nic = calloc(1, sizeof(*dup_nic));
if (!dup_nic)
return NULL;

dup_nic->device_attr = calloc(1, sizeof(*dup_nic->device_attr));
dup_nic->bus_attr = calloc(1, sizeof(*dup_nic->bus_attr));
dup_nic->link_attr = calloc(1, sizeof(*dup_nic->link_attr));

if (!dup_nic->device_attr || !dup_nic->bus_attr || !dup_nic->link_attr)
goto fail;

if (!nic) {
dup_nic->fid.fclass = FI_CLASS_NIC;
dup_nic->fid.ops = &default_nic_ops;
return dup_nic;
}

assert(nic->fid.fclass == FI_CLASS_NIC);
dup_nic->fid = nic->fid;

if (nic->device_attr) {
ret = ofi_dup_dev_attr(nic->device_attr, dup_nic->device_attr);
if (ret)
goto fail;
}

if (nic->bus_attr)
*dup_nic->bus_attr = *nic->bus_attr;

if (nic->link_attr) {
ret = ofi_dup_link_attr(nic->link_attr, dup_nic->link_attr);
if (ret)
goto fail;
}

return dup_nic;

fail:
ofi_nic_close(&dup_nic->fid);
return NULL;

}

__attribute__((visibility ("default"),EXTERNALLY_VISIBLE))
void DEFAULT_SYMVER_PRE(fi_freeinfo)(struct fi_info *info)
{
Expand Down Expand Up @@ -796,7 +876,6 @@ struct fi_info *ofi_allocinfo_internal(void)
return NULL;
}


__attribute__((visibility ("default"),EXTERNALLY_VISIBLE))
struct fi_info *DEFAULT_SYMVER_PRE(fi_dupinfo)(const struct fi_info *info)
{
Expand Down

0 comments on commit 84fdc85

Please sign in to comment.