int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index, unsigned int desc_count, unsigned int desc_size) { int err; char res_name[NAME_MAX]; static int instance; rq->index = index; rq->vdev = vdev; rq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_RQ, index); if (!rq->ctrl) { pr_err("Failed to hook RQ[%d] resource\n", index); return -EINVAL; } vnic_rq_disable(rq); snprintf(res_name, sizeof(res_name), "%d-rq-%d", instance++, index); err = vnic_dev_alloc_desc_ring(vdev, &rq->ring, desc_count, desc_size, rq->socket_id, res_name); if (err) return err; err = vnic_rq_alloc_bufs(rq); if (err) { vnic_rq_free(rq); return err; } return 0; }
int vnic_rq_alloc(struct vnic_dev *vdev, struct vnic_rq *rq, unsigned int index, unsigned int desc_count, unsigned int desc_size) { int err; rq->index = index; rq->vdev = vdev; rq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_RQ, index); if (!rq->ctrl) { printk(KERN_ERR "Failed to hook RQ[%d] resource\n", index); return -EINVAL; } vnic_rq_disable(rq); err = vnic_dev_alloc_desc_ring(vdev, &rq->ring, desc_count, desc_size); if (err) return err; err = vnic_rq_alloc_bufs(rq); if (err) { vnic_rq_free(rq); return err; } return 0; }
void enic_free_rq(void *rxq) { struct vnic_rq *rq = (struct vnic_rq *)rxq; struct enic *enic = vnic_dev_priv(rq->vdev); vnic_rq_free(rq); vnic_cq_free(&enic->cq[rq->index]); }
int enic_alloc_rq(struct enic *enic, uint16_t queue_idx, unsigned int socket_id, struct rte_mempool *mp, uint16_t nb_desc) { int rc; struct vnic_rq *rq = &enic->rq[queue_idx]; rq->socket_id = socket_id; rq->mp = mp; if (nb_desc) { if (nb_desc > enic->config.rq_desc_count) { dev_warning(enic, "RQ %d - number of rx desc in cmd line (%d)"\ "is greater than that in the UCSM/CIMC adapter"\ "policy. Applying the value in the adapter "\ "policy (%d).\n", queue_idx, nb_desc, enic->config.rq_desc_count); nb_desc = enic->config.rq_desc_count; } dev_info(enic, "RX Queues - effective number of descs:%d\n", nb_desc); } /* Allocate queue resources */ rc = vnic_rq_alloc(enic->vdev, rq, queue_idx, nb_desc, sizeof(struct rq_enet_desc)); if (rc) { dev_err(enic, "error in allocation of rq\n"); goto err_exit; } rc = vnic_cq_alloc(enic->vdev, &enic->cq[queue_idx], queue_idx, socket_id, nb_desc, sizeof(struct cq_enet_rq_desc)); if (rc) { dev_err(enic, "error in allocation of cq for rq\n"); goto err_free_rq_exit; } /* Allocate the mbuf ring */ rq->mbuf_ring = (struct rte_mbuf **)rte_zmalloc_socket("rq->mbuf_ring", sizeof(struct rte_mbuf *) * nb_desc, RTE_CACHE_LINE_SIZE, rq->socket_id); if (rq->mbuf_ring != NULL) return 0; /* cleanup on error */ vnic_cq_free(&enic->cq[queue_idx]); err_free_rq_exit: vnic_rq_free(rq); err_exit: return -ENOMEM; }
void enic_free_rq(void *rxq) { struct vnic_rq *rq = (struct vnic_rq *)rxq; struct enic *enic = vnic_dev_priv(rq->vdev); enic_rxmbuf_queue_release(enic, rq); rte_free(rq->mbuf_ring); rq->mbuf_ring = NULL; vnic_rq_free(rq); vnic_cq_free(&enic->cq[rq->index]); }
void enic_free_vnic_resources(struct enic *enic) { unsigned int i; for (i = 0; i < enic->wq_count; i++) vnic_wq_free(&enic->wq[i]); for (i = 0; i < enic->rq_count; i++) vnic_rq_free(&enic->rq[i]); for (i = 0; i < enic->cq_count; i++) vnic_cq_free(&enic->cq[i]); vnic_intr_free(&enic->intr); }
int enic_alloc_rq(struct enic *enic, uint16_t queue_idx, unsigned int socket_id, struct rte_mempool *mp, uint16_t nb_desc) { int err; struct vnic_rq *rq = &enic->rq[queue_idx]; rq->socket_id = socket_id; rq->mp = mp; if (nb_desc) { if (nb_desc > enic->config.rq_desc_count) { dev_warning(enic, "RQ %d - number of rx desc in cmd line (%d)"\ "is greater than that in the UCSM/CIMC adapter"\ "policy. Applying the value in the adapter "\ "policy (%d).\n", queue_idx, nb_desc, enic->config.rq_desc_count); } else if (nb_desc != enic->config.rq_desc_count) { enic->config.rq_desc_count = nb_desc; dev_info(enic, "RX Queues - effective number of descs:%d\n", nb_desc); } } /* Allocate queue resources */ err = vnic_rq_alloc(enic->vdev, &enic->rq[queue_idx], queue_idx, enic->config.rq_desc_count, sizeof(struct rq_enet_desc)); if (err) { dev_err(enic, "error in allocation of rq\n"); return err; } err = vnic_cq_alloc(enic->vdev, &enic->cq[queue_idx], queue_idx, socket_id, enic->config.rq_desc_count, sizeof(struct cq_enet_rq_desc)); if (err) { vnic_rq_free(rq); dev_err(enic, "error in allocation of cq for rq\n"); } return err; }
void fnic_free_vnic_resources(struct fnic *fnic) { unsigned int i; for (i = 0; i < fnic->raw_wq_count; i++) vnic_wq_free(&fnic->wq[i]); for (i = 0; i < fnic->wq_copy_count; i++) vnic_wq_copy_free(&fnic->wq_copy[i]); for (i = 0; i < fnic->rq_count; i++) vnic_rq_free(&fnic->rq[i]); for (i = 0; i < fnic->cq_count; i++) vnic_cq_free(&fnic->cq[i]); for (i = 0; i < fnic->intr_count; i++) vnic_intr_free(&fnic->intr[i]); }