[dpdk-dev] [PATCH 12/22] event/dlb2: add port link
Eads, Gage
gage.eads at intel.com
Wed Oct 7 22:40:09 CEST 2020
> +static int
> +dlb2_event_queue_join_ldb(struct dlb2_eventdev *dlb2,
> + struct dlb2_eventdev_port *ev_port,
> + struct dlb2_eventdev_queue *ev_queue,
> + uint8_t priority)
> +{
> + int first_avail = -1;
> + int ret, i;
> +
> + for (i = 0; i < DLB2_MAX_NUM_QIDS_PER_LDB_CQ; i++) {
> + if (ev_port->link[i].valid) {
> + if (ev_port->link[i].queue_id == ev_queue->id &&
> + ev_port->link[i].priority == priority) {
> + if (ev_port->link[i].mapped)
> + return 0; /* already mapped */
> + first_avail = i;
> + }
> + } else if (first_avail == -1) {
> + first_avail = i;
> + }
Nit: braces discouraged on a single-statement conditionals
> + }
> + if (first_avail == -1) {
> + DLB2_LOG_ERR("dlb2: qm_port %d has no available QID slots.\n",
> + ev_port->qm_port.id);
> + return -EINVAL;
> + }
> +
> + ret = dlb2_hw_map_ldb_qid_to_port(&dlb2->qm_instance,
> + ev_port->qm_port.id,
> + ev_queue->qm_queue.id,
> + priority);
> +
> + if (!ret)
> + ev_port->link[first_avail].mapped = true;
> +
> + return ret;
> +}
> +
> +static int32_t
> +dlb2_hw_create_dir_queue(struct dlb2_eventdev *dlb2,
> + struct dlb2_eventdev_queue *ev_queue,
> + int32_t qm_port_id)
> +{
> + struct dlb2_hw_dev *handle = &dlb2->qm_instance;
> + struct dlb2_create_dir_queue_args cfg;
> + int32_t ret;
> +
> + /* The directed port is always configured before its queue */
> + cfg.port_id = qm_port_id;
> +
> + if (ev_queue->depth_threshold == 0) {
> + cfg.depth_threshold =
> RTE_PMD_DLB2_DEFAULT_DEPTH_THRESH;
> + ev_queue->depth_threshold =
> RTE_PMD_DLB2_DEFAULT_DEPTH_THRESH;
> + } else {
> + cfg.depth_threshold = ev_queue->depth_threshold;
> + }
Nit: braces discouraged on a single-statement conditionals
> +
> + ret = dlb2_iface_dir_queue_create(handle, &cfg);
> + if (ret < 0) {
> + DLB2_LOG_ERR("dlb2: create DIR event queue error, ret=%d
> (driver status: %s)\n",
> + ret, dlb2_error_strings[cfg.response.status]);
> + return -EINVAL;
> + }
> +
> + return cfg.response.id;
> +}
> +
> +static int
> +dlb2_eventdev_dir_queue_setup(struct dlb2_eventdev *dlb2,
> + struct dlb2_eventdev_queue *ev_queue,
> + struct dlb2_eventdev_port *ev_port)
> +{
> + int32_t qm_qid;
> +
> + qm_qid = dlb2_hw_create_dir_queue(dlb2, ev_queue, ev_port-
> >qm_port.id);
> +
> + if (qm_qid < 0) {
> + DLB2_LOG_ERR("Failed to create the DIR queue\n");
> + return qm_qid;
> + }
> +
> + dlb2->qm_dir_to_ev_queue_id[qm_qid] = ev_queue->id;
> +
> + ev_queue->qm_queue.id = qm_qid;
> +
> + return 0;
> +}
> +
> +static int
> +dlb2_do_port_link(struct rte_eventdev *dev,
> + struct dlb2_eventdev_queue *ev_queue,
> + struct dlb2_eventdev_port *ev_port,
> + uint8_t prio)
> +{
> + struct dlb2_eventdev *dlb2 = dlb2_pmd_priv(dev);
> + int err;
> +
> + /* Don't link until start time. */
> + if (dlb2->run_state == DLB2_RUN_STATE_STOPPED)
> + return 0;
> +
> + if (ev_queue->qm_queue.is_directed)
> + err = dlb2_eventdev_dir_queue_setup(dlb2, ev_queue,
> ev_port);
> + else
> + err = dlb2_event_queue_join_ldb(dlb2, ev_port, ev_queue,
> prio);
> +
> + if (err) {
> + DLB2_LOG_ERR("port link failure for %s ev_q %d, ev_port %d\n",
> + ev_queue->qm_queue.is_directed ? "DIR" : "LDB",
> + ev_queue->id, ev_port->id);
> +
> + rte_errno = err;
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static int
> +dlb2_validate_port_link(struct dlb2_eventdev_port *ev_port,
> + uint8_t queue_id,
> + bool link_exists,
> + int index)
> +{
> + struct dlb2_eventdev *dlb2 = ev_port->dlb2;
> + struct dlb2_eventdev_queue *ev_queue;
> + bool port_is_dir, queue_is_dir;
> +
> + if (queue_id > dlb2->num_queues) {
> + rte_errno = -EINVAL;
> + return -1;
> + }
> +
> + ev_queue = &dlb2->ev_queues[queue_id];
> +
> + if (!ev_queue->setup_done &&
> + ev_queue->qm_queue.config_state != DLB2_PREV_CONFIGURED) {
> + rte_errno = -EINVAL;
> + return -1;
> + }
> +
> + port_is_dir = ev_port->qm_port.is_directed;
> + queue_is_dir = ev_queue->qm_queue.is_directed;
> +
> + if (port_is_dir != queue_is_dir) {
> + DLB2_LOG_ERR("%s queue %u can't link to %s port %u\n",
> + queue_is_dir ? "DIR" : "LDB", ev_queue->id,
> + port_is_dir ? "DIR" : "LDB", ev_port->id);
> +
> + rte_errno = -EINVAL;
> + return -1;
> + }
> +
> + /* Check if there is space for the requested link */
> + if (!link_exists && index == -1) {
> + DLB2_LOG_ERR("no space for new link\n");
> + rte_errno = -ENOSPC;
> + return -1;
> + }
> +
> + /* Check if the directed port is already linked */
> + if (ev_port->qm_port.is_directed && ev_port->num_links > 0 &&
> + !link_exists) {
> + DLB2_LOG_ERR("Can't link DIR port %d to >1 queues\n",
> + ev_port->id);
> + rte_errno = -EINVAL;
> + return -1;
> + }
> +
> + /* Check if the directed queue is already linked */
> + if (ev_queue->qm_queue.is_directed && ev_queue->num_links > 0 &&
> + !link_exists) {
> + DLB2_LOG_ERR("Can't link DIR queue %d to >1 ports\n",
> + ev_queue->id);
> + rte_errno = -EINVAL;
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +static int
> +dlb2_eventdev_port_link(struct rte_eventdev *dev, void *event_port,
> + const uint8_t queues[], const uint8_t priorities[],
> + uint16_t nb_links)
> +
> +{
> + struct dlb2_eventdev_port *ev_port = event_port;
> + struct dlb2_eventdev *dlb2;
> + int i, j;
> +
> + RTE_SET_USED(dev);
> +
> + if (!ev_port) {
> + DLB2_LOG_ERR("dlb2: evport not setup\n");
> + rte_errno = -EINVAL;
> + return 0;
> + }
> +
> + if (!ev_port->setup_done &&
> + ev_port->qm_port.config_state != DLB2_PREV_CONFIGURED) {
> + DLB2_LOG_ERR("dlb2: evport not setup\n");
> + rte_errno = -EINVAL;
> + return 0;
> + }
> +
> + /* Note: rte_event_port_link() ensures the PMD won't receive a NULL
> + * queues pointer.
> + */
> + if (nb_links == 0) {
> + DLB2_LOG_DBG("dlb2: nb_links is 0\n");
> + return 0; /* Ignore and return success */
> + }
> +
> + dlb2 = ev_port->dlb2;
> +
> + DLB2_LOG_DBG("Linking %u queues to %s port %d\n",
> + nb_links,
> + ev_port->qm_port.is_directed ? "DIR" : "LDB",
> + ev_port->id);
> +
> + for (i = 0; i < nb_links; i++) {
> + struct dlb2_eventdev_queue *ev_queue;
> + uint8_t queue_id, prio;
> + bool found = false;
> + int index = -1;
> +
> + queue_id = queues[i];
> + prio = priorities[i];
> +
> + /* Check if the link already exists. */
> + for (j = 0; j < DLB2_MAX_NUM_QIDS_PER_LDB_CQ; j++)
> + if (ev_port->link[j].valid) {
> + if (ev_port->link[j].queue_id == queue_id) {
> + found = true;
> + index = j;
> + break;
> + }
> + } else if (index == -1) {
> + index = j;
> + }
Nit: braces discouraged on a single-statement conditionals
Thanks,
Gage
More information about the dev
mailing list