/* * 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; }
/* * 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; }