mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-07 01:33:56 -06:00
hw/rdma: Switch to generic error reporting way
Utilize error_report for all pr_err calls and some pr_dbg that are considered as errors. For the remaining pr_dbg calls, the important ones were replaced by trace points while other deleted. Some of the functions got renamed to include prefix "rdma/pvrdma" in the function name. Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com> Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Message-Id: <1552300155-25216-2-git-send-email-yuval.shaia@oracle.com> Reviewed-by: Kamal Heib <kamalheib1@gmail.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
This commit is contained in:
parent
ade0075523
commit
4d71b38ae8
13 changed files with 364 additions and 578 deletions
|
@ -14,7 +14,6 @@
|
|||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "cpu.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/pci/pci.h"
|
||||
|
@ -24,6 +23,7 @@
|
|||
#include "../rdma_rm.h"
|
||||
#include "../rdma_utils.h"
|
||||
|
||||
#include "trace.h"
|
||||
#include "pvrdma.h"
|
||||
#include "standard-headers/rdma/vmw_pvrdma-abi.h"
|
||||
|
||||
|
@ -35,40 +35,38 @@ static void *pvrdma_map_to_pdir(PCIDevice *pdev, uint64_t pdir_dma,
|
|||
void *host_virt = NULL, *curr_page;
|
||||
|
||||
if (!nchunks) {
|
||||
pr_dbg("nchunks=0\n");
|
||||
rdma_error_report("Got nchunks=0");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dir = rdma_pci_dma_map(pdev, pdir_dma, TARGET_PAGE_SIZE);
|
||||
if (!dir) {
|
||||
error_report("PVRDMA: Failed to map to page directory");
|
||||
rdma_error_report("Failed to map to page directory");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tbl = rdma_pci_dma_map(pdev, dir[0], TARGET_PAGE_SIZE);
|
||||
if (!tbl) {
|
||||
error_report("PVRDMA: Failed to map to page table 0");
|
||||
rdma_error_report("Failed to map to page table 0");
|
||||
goto out_unmap_dir;
|
||||
}
|
||||
|
||||
curr_page = rdma_pci_dma_map(pdev, (dma_addr_t)tbl[0], TARGET_PAGE_SIZE);
|
||||
if (!curr_page) {
|
||||
error_report("PVRDMA: Failed to map the first page");
|
||||
rdma_error_report("Failed to map the page 0");
|
||||
goto out_unmap_tbl;
|
||||
}
|
||||
|
||||
host_virt = mremap(curr_page, 0, length, MREMAP_MAYMOVE);
|
||||
pr_dbg("mremap %p -> %p\n", curr_page, host_virt);
|
||||
if (host_virt == MAP_FAILED) {
|
||||
host_virt = NULL;
|
||||
error_report("PVRDMA: Failed to remap memory for host_virt");
|
||||
rdma_error_report("Failed to remap memory for host_virt");
|
||||
goto out_unmap_tbl;
|
||||
}
|
||||
trace_pvrdma_map_to_pdir_host_virt(curr_page, host_virt);
|
||||
|
||||
rdma_pci_dma_unmap(pdev, curr_page, TARGET_PAGE_SIZE);
|
||||
|
||||
pr_dbg("host_virt=%p\n", host_virt);
|
||||
|
||||
dir_idx = 0;
|
||||
tbl_idx = 1;
|
||||
addr_idx = 1;
|
||||
|
@ -76,28 +74,28 @@ static void *pvrdma_map_to_pdir(PCIDevice *pdev, uint64_t pdir_dma,
|
|||
if (tbl_idx == TARGET_PAGE_SIZE / sizeof(uint64_t)) {
|
||||
tbl_idx = 0;
|
||||
dir_idx++;
|
||||
pr_dbg("Mapping to table %d\n", dir_idx);
|
||||
rdma_pci_dma_unmap(pdev, tbl, TARGET_PAGE_SIZE);
|
||||
tbl = rdma_pci_dma_map(pdev, dir[dir_idx], TARGET_PAGE_SIZE);
|
||||
if (!tbl) {
|
||||
error_report("PVRDMA: Failed to map to page table %d", dir_idx);
|
||||
rdma_error_report("Failed to map to page table %d", dir_idx);
|
||||
goto out_unmap_host_virt;
|
||||
}
|
||||
}
|
||||
|
||||
pr_dbg("guest_dma[%d]=0x%" PRIx64 "\n", addr_idx, tbl[tbl_idx]);
|
||||
|
||||
curr_page = rdma_pci_dma_map(pdev, (dma_addr_t)tbl[tbl_idx],
|
||||
TARGET_PAGE_SIZE);
|
||||
if (!curr_page) {
|
||||
error_report("PVRDMA: Failed to map to page %d, dir %d", tbl_idx,
|
||||
dir_idx);
|
||||
rdma_error_report("Failed to map to page %d, dir %d", tbl_idx,
|
||||
dir_idx);
|
||||
goto out_unmap_host_virt;
|
||||
}
|
||||
|
||||
mremap(curr_page, 0, TARGET_PAGE_SIZE, MREMAP_MAYMOVE | MREMAP_FIXED,
|
||||
host_virt + TARGET_PAGE_SIZE * addr_idx);
|
||||
|
||||
trace_pvrdma_map_to_pdir_next_page(addr_idx, curr_page, host_virt +
|
||||
TARGET_PAGE_SIZE * addr_idx);
|
||||
|
||||
rdma_pci_dma_unmap(pdev, curr_page, TARGET_PAGE_SIZE);
|
||||
|
||||
addr_idx++;
|
||||
|
@ -127,7 +125,6 @@ static int query_port(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
struct pvrdma_cmd_query_port_resp *resp = &rsp->query_port_resp;
|
||||
struct pvrdma_port_attr attrs = {0};
|
||||
|
||||
pr_dbg("port=%d\n", cmd->port_num);
|
||||
if (cmd->port_num > MAX_PORTS) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -159,12 +156,10 @@ static int query_pkey(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
struct pvrdma_cmd_query_pkey *cmd = &req->query_pkey;
|
||||
struct pvrdma_cmd_query_pkey_resp *resp = &rsp->query_pkey_resp;
|
||||
|
||||
pr_dbg("port=%d\n", cmd->port_num);
|
||||
if (cmd->port_num > MAX_PORTS) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pr_dbg("index=%d\n", cmd->index);
|
||||
if (cmd->index > MAX_PKEYS) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -172,7 +167,6 @@ static int query_pkey(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
memset(resp, 0, sizeof(*resp));
|
||||
|
||||
resp->pkey = PVRDMA_PKEY;
|
||||
pr_dbg("pkey=0x%x\n", resp->pkey);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -184,8 +178,6 @@ static int create_pd(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
struct pvrdma_cmd_create_pd_resp *resp = &rsp->create_pd_resp;
|
||||
int rc;
|
||||
|
||||
pr_dbg("context=0x%x\n", cmd->ctx_handle ? cmd->ctx_handle : 0);
|
||||
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
rc = rdma_rm_alloc_pd(&dev->rdma_dev_res, &dev->backend_dev,
|
||||
&resp->pd_handle, cmd->ctx_handle);
|
||||
|
@ -198,8 +190,6 @@ static int destroy_pd(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
{
|
||||
struct pvrdma_cmd_destroy_pd *cmd = &req->destroy_pd;
|
||||
|
||||
pr_dbg("pd_handle=%d\n", cmd->pd_handle);
|
||||
|
||||
rdma_rm_dealloc_pd(&dev->rdma_dev_res, cmd->pd_handle);
|
||||
|
||||
return 0;
|
||||
|
@ -216,15 +206,11 @@ static int create_mr(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
|
||||
pr_dbg("pd_handle=%d\n", cmd->pd_handle);
|
||||
pr_dbg("access_flags=0x%x\n", cmd->access_flags);
|
||||
pr_dbg("flags=0x%x\n", cmd->flags);
|
||||
|
||||
if (!(cmd->flags & PVRDMA_MR_FLAG_DMA)) {
|
||||
host_virt = pvrdma_map_to_pdir(pci_dev, cmd->pdir_dma, cmd->nchunks,
|
||||
cmd->length);
|
||||
if (!host_virt) {
|
||||
pr_dbg("Failed to map to pdir\n");
|
||||
rdma_error_report("Failed to map to pdir");
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
@ -244,8 +230,6 @@ static int destroy_mr(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
{
|
||||
struct pvrdma_cmd_destroy_mr *cmd = &req->destroy_mr;
|
||||
|
||||
pr_dbg("mr_handle=%d\n", cmd->mr_handle);
|
||||
|
||||
rdma_rm_dealloc_mr(&dev->rdma_dev_res, cmd->mr_handle);
|
||||
|
||||
return 0;
|
||||
|
@ -260,20 +244,19 @@ static int create_cq_ring(PCIDevice *pci_dev , PvrdmaRing **ring,
|
|||
char ring_name[MAX_RING_NAME_SZ];
|
||||
|
||||
if (!nchunks || nchunks > PVRDMA_MAX_FAST_REG_PAGES) {
|
||||
pr_dbg("invalid nchunks: %d\n", nchunks);
|
||||
rdma_error_report("Got invalid nchunks: %d", nchunks);
|
||||
return rc;
|
||||
}
|
||||
|
||||
pr_dbg("pdir_dma=0x%llx\n", (long long unsigned int)pdir_dma);
|
||||
dir = rdma_pci_dma_map(pci_dev, pdir_dma, TARGET_PAGE_SIZE);
|
||||
if (!dir) {
|
||||
pr_dbg("Failed to map to CQ page directory\n");
|
||||
rdma_error_report("Failed to map to CQ page directory");
|
||||
goto out;
|
||||
}
|
||||
|
||||
tbl = rdma_pci_dma_map(pci_dev, dir[0], TARGET_PAGE_SIZE);
|
||||
if (!tbl) {
|
||||
pr_dbg("Failed to map to CQ page table\n");
|
||||
rdma_error_report("Failed to map to CQ page table");
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -284,7 +267,7 @@ static int create_cq_ring(PCIDevice *pci_dev , PvrdmaRing **ring,
|
|||
rdma_pci_dma_map(pci_dev, tbl[0], TARGET_PAGE_SIZE);
|
||||
|
||||
if (!r->ring_state) {
|
||||
pr_dbg("Failed to map to CQ ring state\n");
|
||||
rdma_error_report("Failed to map to CQ ring state");
|
||||
goto out_free_ring;
|
||||
}
|
||||
|
||||
|
@ -339,8 +322,6 @@ static int create_cq(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
return rc;
|
||||
}
|
||||
|
||||
pr_dbg("ring=%p\n", ring);
|
||||
|
||||
rc = rdma_rm_alloc_cq(&dev->rdma_dev_res, &dev->backend_dev, cmd->cqe,
|
||||
&resp->cq_handle, ring);
|
||||
if (rc) {
|
||||
|
@ -359,11 +340,9 @@ static int destroy_cq(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
RdmaRmCQ *cq;
|
||||
PvrdmaRing *ring;
|
||||
|
||||
pr_dbg("cq_handle=%d\n", cmd->cq_handle);
|
||||
|
||||
cq = rdma_rm_get_cq(&dev->rdma_dev_res, cmd->cq_handle);
|
||||
if (!cq) {
|
||||
pr_dbg("Invalid CQ handle\n");
|
||||
rdma_error_report("Got invalid CQ handle");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -388,42 +367,33 @@ static int create_qp_rings(PCIDevice *pci_dev, uint64_t pdir_dma,
|
|||
|
||||
if (!spages || spages > PVRDMA_MAX_FAST_REG_PAGES
|
||||
|| !rpages || rpages > PVRDMA_MAX_FAST_REG_PAGES) {
|
||||
pr_dbg("invalid pages: %d, %d\n", spages, rpages);
|
||||
rdma_error_report("Got invalid page count for QP ring: %d, %d", spages,
|
||||
rpages);
|
||||
return rc;
|
||||
}
|
||||
|
||||
pr_dbg("pdir_dma=0x%llx\n", (long long unsigned int)pdir_dma);
|
||||
dir = rdma_pci_dma_map(pci_dev, pdir_dma, TARGET_PAGE_SIZE);
|
||||
if (!dir) {
|
||||
pr_dbg("Failed to map to CQ page directory\n");
|
||||
rdma_error_report("Failed to map to CQ page directory");
|
||||
goto out;
|
||||
}
|
||||
|
||||
tbl = rdma_pci_dma_map(pci_dev, dir[0], TARGET_PAGE_SIZE);
|
||||
if (!tbl) {
|
||||
pr_dbg("Failed to map to CQ page table\n");
|
||||
rdma_error_report("Failed to map to CQ page table");
|
||||
goto out;
|
||||
}
|
||||
|
||||
sr = g_malloc(2 * sizeof(*rr));
|
||||
rr = &sr[1];
|
||||
pr_dbg("sring=%p\n", sr);
|
||||
pr_dbg("rring=%p\n", rr);
|
||||
|
||||
*rings = sr;
|
||||
|
||||
pr_dbg("scqe=%d\n", scqe);
|
||||
pr_dbg("smax_sge=%d\n", smax_sge);
|
||||
pr_dbg("spages=%d\n", spages);
|
||||
pr_dbg("rcqe=%d\n", rcqe);
|
||||
pr_dbg("rmax_sge=%d\n", rmax_sge);
|
||||
pr_dbg("rpages=%d\n", rpages);
|
||||
|
||||
/* Create send ring */
|
||||
sr->ring_state = (struct pvrdma_ring *)
|
||||
rdma_pci_dma_map(pci_dev, tbl[0], TARGET_PAGE_SIZE);
|
||||
if (!sr->ring_state) {
|
||||
pr_dbg("Failed to map to CQ ring state\n");
|
||||
rdma_error_report("Failed to map to CQ ring state");
|
||||
goto out_free_sr_mem;
|
||||
}
|
||||
|
||||
|
@ -468,9 +438,7 @@ out:
|
|||
|
||||
static void destroy_qp_rings(PvrdmaRing *ring)
|
||||
{
|
||||
pr_dbg("sring=%p\n", &ring[0]);
|
||||
pvrdma_ring_free(&ring[0]);
|
||||
pr_dbg("rring=%p\n", &ring[1]);
|
||||
pvrdma_ring_free(&ring[1]);
|
||||
|
||||
rdma_pci_dma_unmap(ring->dev, ring->ring_state, TARGET_PAGE_SIZE);
|
||||
|
@ -487,9 +455,6 @@ static int create_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
|
||||
pr_dbg("total_chunks=%d\n", cmd->total_chunks);
|
||||
pr_dbg("send_chunks=%d\n", cmd->send_chunks);
|
||||
|
||||
rc = create_qp_rings(PCI_DEVICE(dev), cmd->pdir_dma, &rings,
|
||||
cmd->max_send_wr, cmd->max_send_sge, cmd->send_chunks,
|
||||
cmd->max_recv_wr, cmd->max_recv_sge,
|
||||
|
@ -498,8 +463,6 @@ static int create_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
return rc;
|
||||
}
|
||||
|
||||
pr_dbg("rings=%p\n", rings);
|
||||
|
||||
rc = rdma_rm_alloc_qp(&dev->rdma_dev_res, cmd->pd_handle, cmd->qp_type,
|
||||
cmd->max_send_wr, cmd->max_send_sge,
|
||||
cmd->send_cq_handle, cmd->max_recv_wr,
|
||||
|
@ -525,8 +488,6 @@ static int modify_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
struct pvrdma_cmd_modify_qp *cmd = &req->modify_qp;
|
||||
int rc;
|
||||
|
||||
pr_dbg("qp_handle=%d\n", cmd->qp_handle);
|
||||
|
||||
memset(rsp, 0, sizeof(*rsp));
|
||||
|
||||
/* No need to verify sgid_index since it is u8 */
|
||||
|
@ -551,9 +512,6 @@ static int query_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
struct ibv_qp_init_attr init_attr;
|
||||
int rc;
|
||||
|
||||
pr_dbg("qp_handle=%d\n", cmd->qp_handle);
|
||||
pr_dbg("attr_mask=0x%x\n", cmd->attr_mask);
|
||||
|
||||
memset(rsp, 0, sizeof(*rsp));
|
||||
|
||||
rc = rdma_rm_query_qp(&dev->rdma_dev_res, &dev->backend_dev, cmd->qp_handle,
|
||||
|
@ -572,7 +530,6 @@ static int destroy_qp(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
|
||||
qp = rdma_rm_get_qp(&dev->rdma_dev_res, cmd->qp_handle);
|
||||
if (!qp) {
|
||||
pr_dbg("Invalid QP handle\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -591,16 +548,10 @@ static int create_bind(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
int rc;
|
||||
union ibv_gid *gid = (union ibv_gid *)&cmd->new_gid;
|
||||
|
||||
pr_dbg("index=%d\n", cmd->index);
|
||||
|
||||
if (cmd->index >= MAX_PORT_GIDS) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pr_dbg("gid[%d]=0x%llx,0x%llx\n", cmd->index,
|
||||
(long long unsigned int)be64_to_cpu(gid->global.subnet_prefix),
|
||||
(long long unsigned int)be64_to_cpu(gid->global.interface_id));
|
||||
|
||||
rc = rdma_rm_add_gid(&dev->rdma_dev_res, &dev->backend_dev,
|
||||
dev->backend_eth_device_name, gid, cmd->index);
|
||||
|
||||
|
@ -614,8 +565,6 @@ static int destroy_bind(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
|
||||
struct pvrdma_cmd_destroy_bind *cmd = &req->destroy_bind;
|
||||
|
||||
pr_dbg("index=%d\n", cmd->index);
|
||||
|
||||
if (cmd->index >= MAX_PORT_GIDS) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
@ -633,8 +582,6 @@ static int create_uc(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
struct pvrdma_cmd_create_uc_resp *resp = &rsp->create_uc_resp;
|
||||
int rc;
|
||||
|
||||
pr_dbg("pfn=%d\n", cmd->pfn);
|
||||
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
rc = rdma_rm_alloc_uc(&dev->rdma_dev_res, cmd->pfn, &resp->ctx_handle);
|
||||
|
||||
|
@ -646,8 +593,6 @@ static int destroy_uc(PVRDMADev *dev, union pvrdma_cmd_req *req,
|
|||
{
|
||||
struct pvrdma_cmd_destroy_uc *cmd = &req->destroy_uc;
|
||||
|
||||
pr_dbg("ctx_handle=%d\n", cmd->ctx_handle);
|
||||
|
||||
rdma_rm_dealloc_uc(&dev->rdma_dev_res, cmd->ctx_handle);
|
||||
|
||||
return 0;
|
||||
|
@ -680,22 +625,21 @@ static struct cmd_handler cmd_handlers[] = {
|
|||
{PVRDMA_CMD_DESTROY_BIND, PVRDMA_CMD_DESTROY_BIND_RESP_NOOP, destroy_bind},
|
||||
};
|
||||
|
||||
int execute_command(PVRDMADev *dev)
|
||||
int pvrdma_exec_cmd(PVRDMADev *dev)
|
||||
{
|
||||
int err = 0xFFFF;
|
||||
DSRInfo *dsr_info;
|
||||
|
||||
dsr_info = &dev->dsr_info;
|
||||
|
||||
pr_dbg("cmd=%d\n", dsr_info->req->hdr.cmd);
|
||||
if (dsr_info->req->hdr.cmd >= sizeof(cmd_handlers) /
|
||||
sizeof(struct cmd_handler)) {
|
||||
pr_dbg("Unsupported command\n");
|
||||
rdma_error_report("Unsupported command");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (!cmd_handlers[dsr_info->req->hdr.cmd].exec) {
|
||||
pr_dbg("Unsupported command (not implemented yet)\n");
|
||||
rdma_error_report("Unsupported command (not implemented yet)");
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -704,7 +648,8 @@ int execute_command(PVRDMADev *dev)
|
|||
dsr_info->rsp->hdr.response = dsr_info->req->hdr.response;
|
||||
dsr_info->rsp->hdr.ack = cmd_handlers[dsr_info->req->hdr.cmd].ack;
|
||||
dsr_info->rsp->hdr.err = err < 0 ? -err : 0;
|
||||
pr_dbg("rsp->hdr.err=%d\n", dsr_info->rsp->hdr.err);
|
||||
|
||||
trace_pvrdma_exec_cmd(dsr_info->req->hdr.cmd, dsr_info->rsp->hdr.err);
|
||||
|
||||
out:
|
||||
set_reg_val(dev, PVRDMA_REG_ERR, err);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue