aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/nvme/host/pci.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 925467b31a33..ea892e732268 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -109,6 +109,7 @@ struct nvme_dev {
109 /* host memory buffer support: */ 109 /* host memory buffer support: */
110 u64 host_mem_size; 110 u64 host_mem_size;
111 u32 nr_host_mem_descs; 111 u32 nr_host_mem_descs;
112 dma_addr_t host_mem_descs_dma;
112 struct nvme_host_mem_buf_desc *host_mem_descs; 113 struct nvme_host_mem_buf_desc *host_mem_descs;
113 void **host_mem_desc_bufs; 114 void **host_mem_desc_bufs;
114}; 115};
@@ -1565,16 +1566,10 @@ static inline void nvme_release_cmb(struct nvme_dev *dev)
1565 1566
1566static int nvme_set_host_mem(struct nvme_dev *dev, u32 bits) 1567static int nvme_set_host_mem(struct nvme_dev *dev, u32 bits)
1567{ 1568{
1568 size_t len = dev->nr_host_mem_descs * sizeof(*dev->host_mem_descs); 1569 u64 dma_addr = dev->host_mem_descs_dma;
1569 struct nvme_command c; 1570 struct nvme_command c;
1570 u64 dma_addr;
1571 int ret; 1571 int ret;
1572 1572
1573 dma_addr = dma_map_single(dev->dev, dev->host_mem_descs, len,
1574 DMA_TO_DEVICE);
1575 if (dma_mapping_error(dev->dev, dma_addr))
1576 return -ENOMEM;
1577
1578 memset(&c, 0, sizeof(c)); 1573 memset(&c, 0, sizeof(c));
1579 c.features.opcode = nvme_admin_set_features; 1574 c.features.opcode = nvme_admin_set_features;
1580 c.features.fid = cpu_to_le32(NVME_FEAT_HOST_MEM_BUF); 1575 c.features.fid = cpu_to_le32(NVME_FEAT_HOST_MEM_BUF);
@@ -1591,7 +1586,6 @@ static int nvme_set_host_mem(struct nvme_dev *dev, u32 bits)
1591 "failed to set host mem (err %d, flags %#x).\n", 1586 "failed to set host mem (err %d, flags %#x).\n",
1592 ret, bits); 1587 ret, bits);
1593 } 1588 }
1594 dma_unmap_single(dev->dev, dma_addr, len, DMA_TO_DEVICE);
1595 return ret; 1589 return ret;
1596} 1590}
1597 1591
@@ -1609,7 +1603,9 @@ static void nvme_free_host_mem(struct nvme_dev *dev)
1609 1603
1610 kfree(dev->host_mem_desc_bufs); 1604 kfree(dev->host_mem_desc_bufs);
1611 dev->host_mem_desc_bufs = NULL; 1605 dev->host_mem_desc_bufs = NULL;
1612 kfree(dev->host_mem_descs); 1606 dma_free_coherent(dev->dev,
1607 dev->nr_host_mem_descs * sizeof(*dev->host_mem_descs),
1608 dev->host_mem_descs, dev->host_mem_descs_dma);
1613 dev->host_mem_descs = NULL; 1609 dev->host_mem_descs = NULL;
1614} 1610}
1615 1611
@@ -1617,6 +1613,7 @@ static int nvme_alloc_host_mem(struct nvme_dev *dev, u64 min, u64 preferred)
1617{ 1613{
1618 struct nvme_host_mem_buf_desc *descs; 1614 struct nvme_host_mem_buf_desc *descs;
1619 u32 chunk_size, max_entries, len; 1615 u32 chunk_size, max_entries, len;
1616 dma_addr_t descs_dma;
1620 int i = 0; 1617 int i = 0;
1621 void **bufs; 1618 void **bufs;
1622 u64 size = 0, tmp; 1619 u64 size = 0, tmp;
@@ -1627,7 +1624,8 @@ retry:
1627 tmp = (preferred + chunk_size - 1); 1624 tmp = (preferred + chunk_size - 1);
1628 do_div(tmp, chunk_size); 1625 do_div(tmp, chunk_size);
1629 max_entries = tmp; 1626 max_entries = tmp;
1630 descs = kcalloc(max_entries, sizeof(*descs), GFP_KERNEL); 1627 descs = dma_zalloc_coherent(dev->dev, max_entries * sizeof(*descs),
1628 &descs_dma, GFP_KERNEL);
1631 if (!descs) 1629 if (!descs)
1632 goto out; 1630 goto out;
1633 1631
@@ -1661,6 +1659,7 @@ retry:
1661 dev->nr_host_mem_descs = i; 1659 dev->nr_host_mem_descs = i;
1662 dev->host_mem_size = size; 1660 dev->host_mem_size = size;
1663 dev->host_mem_descs = descs; 1661 dev->host_mem_descs = descs;
1662 dev->host_mem_descs_dma = descs_dma;
1664 dev->host_mem_desc_bufs = bufs; 1663 dev->host_mem_desc_bufs = bufs;
1665 return 0; 1664 return 0;
1666 1665
@@ -1674,7 +1673,8 @@ out_free_bufs:
1674 1673
1675 kfree(bufs); 1674 kfree(bufs);
1676out_free_descs: 1675out_free_descs:
1677 kfree(descs); 1676 dma_free_coherent(dev->dev, max_entries * sizeof(*descs), descs,
1677 descs_dma);
1678out: 1678out:
1679 /* try a smaller chunk size if we failed early */ 1679 /* try a smaller chunk size if we failed early */
1680 if (chunk_size >= PAGE_SIZE * 2 && (i == 0 || size < min)) { 1680 if (chunk_size >= PAGE_SIZE * 2 && (i == 0 || size < min)) {