diff options
| -rw-r--r-- | drivers/nvme/host/pci.c | 22 |
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 | ||
| 1566 | static int nvme_set_host_mem(struct nvme_dev *dev, u32 bits) | 1567 | static 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); |
| 1676 | out_free_descs: | 1675 | out_free_descs: |
| 1677 | kfree(descs); | 1676 | dma_free_coherent(dev->dev, max_entries * sizeof(*descs), descs, |
| 1677 | descs_dma); | ||
| 1678 | out: | 1678 | out: |
| 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)) { |
