Example #1
0
/*
 * Allocate a usd_device without allocating a PD
 */
static int
usd_dev_alloc_init(struct usd_context *context, const char *dev_name, int cmd_fd,
                    int check_ready, struct usd_device **dev_o)
{
    struct usd_device *dev = NULL;
    int ret;

    dev = calloc(sizeof(*dev), 1);
    if (dev == NULL) {
        ret = -errno;
        goto out;
    }

    dev->ud_flags = 0;
    if (context == NULL) {
        ret = usd_open_context(dev_name, cmd_fd, &dev->ud_ctx);
        if (ret != 0) {
            goto out;
        }
        dev->ud_flags |= USD_DEVF_CLOSE_CTX;
    } else {
        dev->ud_ctx = context;
    }

    dev->ud_arp_sockfd = -1;

    TAILQ_INIT(&dev->ud_pending_reqs);
    TAILQ_INIT(&dev->ud_completed_reqs);

    if (context == NULL)
        ret = usd_discover_device_attrs(dev, dev_name);
    else
        ret = usd_discover_device_attrs(dev, context->ucx_ib_dev->id_usnic_name);
    if (ret != 0)
        goto out;

    dev->ud_attrs.uda_event_fd = dev->ud_ctx->event_fd;
    dev->ud_attrs.uda_num_comp_vectors = dev->ud_ctx->num_comp_vectors;

    if (check_ready) {
        ret = usd_device_ready(dev);
        if (ret != 0) {
            goto out;
        }
    }

    *dev_o = dev;
    return 0;

out:
    if (dev != NULL)
        usd_dev_free(dev);
    return ret;
}
Example #2
0
/*
 * Open a raw USNIC device
 */
int
usd_open_with_fd(
    const char *dev_name,
    int cmd_fd,
    int check_ready,
    struct usd_device **dev_o)
{
    struct usd_ib_dev *idp;
    struct usd_device *dev = NULL;
    int ret;

    ret = usd_init();
    if (ret != 0) {
        return ret;
    }

    /* Look for matching device */
    idp = usd_ib_dev_list;
    while (idp != NULL) {
        if (dev_name == NULL || strcmp(idp->id_usnic_name, dev_name) == 0) {
            break;
        }
        idp = idp->id_next;
    }

    /* not found, leave now */
    if (idp == NULL) {
        ret = -ENXIO;
        goto out;
    }

    /*
     * Found mathcing device, open an instance
     */
    dev = calloc(sizeof(*dev), 1);
    if (dev == NULL) {
        ret = -errno;
        goto out;
    }
    dev->ud_ib_dev_fd = -1;
    dev->ud_arp_sockfd = -1;
    dev->ud_flags = 0;
    TAILQ_INIT(&dev->ud_pending_reqs);
    TAILQ_INIT(&dev->ud_completed_reqs);

    /* Save pointer to IB device */
    dev->ud_ib_dev = idp;

    /* Open the fd we will be using for IB commands */
    if (cmd_fd == -1) {
        dev->ud_ib_dev_fd = open(idp->id_dev_path, O_RDWR);
        if (dev->ud_ib_dev_fd == -1) {
            ret = -ENODEV;
            goto out;
        }
        dev->ud_flags |= USD_DEVF_CLOSE_CMD_FD;
    } else {
        dev->ud_ib_dev_fd = cmd_fd;
    }

    /* allocate a context from driver */
    ret = usd_get_context(dev);
    if (ret != 0) {
        goto out;
    }
    ret = usd_ib_cmd_alloc_pd(dev, &dev->ud_pd_handle);
    if (ret != 0) {
        goto out;
    }

    ret = usd_discover_device_attrs(dev, dev_name);
    if (ret != 0)
        goto out;

    if (check_ready) {
        ret = usd_device_ready(dev);
        if (ret != 0) {
            goto out;
        }
    }

    TAILQ_INSERT_TAIL(&usd_device_list, dev, ud_link);
    *dev_o = dev;

    return 0;

  out:
    if (dev != NULL) {
        if (dev->ud_flags & USD_DEVF_CLOSE_CMD_FD
            && dev->ud_ib_dev_fd != -1)
            close(dev->ud_ib_dev_fd);
        free(dev);
    }
    return ret;
}