IB/mthca: Use an enum for HCA page size
Use a named enum for the HCA's internal page size, rather than having magic values of 4096 and shifts by 12 all over the code. Also, fix one minor bug in EQ handling: only one HCA page is mapped to the HCA during initialization, but a full kernel page is unmapped during cleanup. This might cause problems when PAGE_SIZE != 4096. Signed-off-by: Ishai Rabinovitz <ishai@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
committed by
Roland Dreier
parent
67e7377661
commit
8d3ef29d6b
@@ -202,7 +202,8 @@ void mthca_table_put(struct mthca_dev *dev, struct mthca_icm_table *table, int o
|
||||
|
||||
if (--table->icm[i]->refcount == 0) {
|
||||
mthca_UNMAP_ICM(dev, table->virt + i * MTHCA_TABLE_CHUNK_SIZE,
|
||||
MTHCA_TABLE_CHUNK_SIZE >> 12, &status);
|
||||
MTHCA_TABLE_CHUNK_SIZE / MTHCA_ICM_PAGE_SIZE,
|
||||
&status);
|
||||
mthca_free_icm(dev, table->icm[i]);
|
||||
table->icm[i] = NULL;
|
||||
}
|
||||
@@ -336,7 +337,8 @@ err:
|
||||
for (i = 0; i < num_icm; ++i)
|
||||
if (table->icm[i]) {
|
||||
mthca_UNMAP_ICM(dev, virt + i * MTHCA_TABLE_CHUNK_SIZE,
|
||||
MTHCA_TABLE_CHUNK_SIZE >> 12, &status);
|
||||
MTHCA_TABLE_CHUNK_SIZE / MTHCA_ICM_PAGE_SIZE,
|
||||
&status);
|
||||
mthca_free_icm(dev, table->icm[i]);
|
||||
}
|
||||
|
||||
@@ -353,7 +355,8 @@ void mthca_free_icm_table(struct mthca_dev *dev, struct mthca_icm_table *table)
|
||||
for (i = 0; i < table->num_icm; ++i)
|
||||
if (table->icm[i]) {
|
||||
mthca_UNMAP_ICM(dev, table->virt + i * MTHCA_TABLE_CHUNK_SIZE,
|
||||
MTHCA_TABLE_CHUNK_SIZE >> 12, &status);
|
||||
MTHCA_TABLE_CHUNK_SIZE / MTHCA_ICM_PAGE_SIZE,
|
||||
&status);
|
||||
mthca_free_icm(dev, table->icm[i]);
|
||||
}
|
||||
|
||||
@@ -364,7 +367,7 @@ static u64 mthca_uarc_virt(struct mthca_dev *dev, struct mthca_uar *uar, int pag
|
||||
{
|
||||
return dev->uar_table.uarc_base +
|
||||
uar->index * dev->uar_table.uarc_size +
|
||||
page * 4096;
|
||||
page * MTHCA_ICM_PAGE_SIZE;
|
||||
}
|
||||
|
||||
int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar,
|
||||
@@ -401,7 +404,7 @@ int mthca_map_user_db(struct mthca_dev *dev, struct mthca_uar *uar,
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
db_tab->page[i].mem.length = 4096;
|
||||
db_tab->page[i].mem.length = MTHCA_ICM_PAGE_SIZE;
|
||||
db_tab->page[i].mem.offset = uaddr & ~PAGE_MASK;
|
||||
|
||||
ret = pci_map_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE);
|
||||
@@ -455,7 +458,7 @@ struct mthca_user_db_table *mthca_init_user_db_tab(struct mthca_dev *dev)
|
||||
if (!mthca_is_memfree(dev))
|
||||
return NULL;
|
||||
|
||||
npages = dev->uar_table.uarc_size / 4096;
|
||||
npages = dev->uar_table.uarc_size / MTHCA_ICM_PAGE_SIZE;
|
||||
db_tab = kmalloc(sizeof *db_tab + npages * sizeof *db_tab->page, GFP_KERNEL);
|
||||
if (!db_tab)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
@@ -478,7 +481,7 @@ void mthca_cleanup_user_db_tab(struct mthca_dev *dev, struct mthca_uar *uar,
|
||||
if (!mthca_is_memfree(dev))
|
||||
return;
|
||||
|
||||
for (i = 0; i < dev->uar_table.uarc_size / 4096; ++i) {
|
||||
for (i = 0; i < dev->uar_table.uarc_size / MTHCA_ICM_PAGE_SIZE; ++i) {
|
||||
if (db_tab->page[i].uvirt) {
|
||||
mthca_UNMAP_ICM(dev, mthca_uarc_virt(dev, uar, i), 1, &status);
|
||||
pci_unmap_sg(dev->pdev, &db_tab->page[i].mem, 1, PCI_DMA_TODEVICE);
|
||||
@@ -551,20 +554,20 @@ int mthca_alloc_db(struct mthca_dev *dev, enum mthca_db_type type,
|
||||
page = dev->db_tab->page + end;
|
||||
|
||||
alloc:
|
||||
page->db_rec = dma_alloc_coherent(&dev->pdev->dev, 4096,
|
||||
page->db_rec = dma_alloc_coherent(&dev->pdev->dev, MTHCA_ICM_PAGE_SIZE,
|
||||
&page->mapping, GFP_KERNEL);
|
||||
if (!page->db_rec) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
memset(page->db_rec, 0, 4096);
|
||||
memset(page->db_rec, 0, MTHCA_ICM_PAGE_SIZE);
|
||||
|
||||
ret = mthca_MAP_ICM_page(dev, page->mapping,
|
||||
mthca_uarc_virt(dev, &dev->driver_uar, i), &status);
|
||||
if (!ret && status)
|
||||
ret = -EINVAL;
|
||||
if (ret) {
|
||||
dma_free_coherent(&dev->pdev->dev, 4096,
|
||||
dma_free_coherent(&dev->pdev->dev, MTHCA_ICM_PAGE_SIZE,
|
||||
page->db_rec, page->mapping);
|
||||
goto out;
|
||||
}
|
||||
@@ -612,7 +615,7 @@ void mthca_free_db(struct mthca_dev *dev, int type, int db_index)
|
||||
i >= dev->db_tab->max_group1 - 1) {
|
||||
mthca_UNMAP_ICM(dev, mthca_uarc_virt(dev, &dev->driver_uar, i), 1, &status);
|
||||
|
||||
dma_free_coherent(&dev->pdev->dev, 4096,
|
||||
dma_free_coherent(&dev->pdev->dev, MTHCA_ICM_PAGE_SIZE,
|
||||
page->db_rec, page->mapping);
|
||||
page->db_rec = NULL;
|
||||
|
||||
@@ -640,7 +643,7 @@ int mthca_init_db_tab(struct mthca_dev *dev)
|
||||
|
||||
mutex_init(&dev->db_tab->mutex);
|
||||
|
||||
dev->db_tab->npages = dev->uar_table.uarc_size / 4096;
|
||||
dev->db_tab->npages = dev->uar_table.uarc_size / MTHCA_ICM_PAGE_SIZE;
|
||||
dev->db_tab->max_group1 = 0;
|
||||
dev->db_tab->min_group2 = dev->db_tab->npages - 1;
|
||||
|
||||
@@ -681,7 +684,7 @@ void mthca_cleanup_db_tab(struct mthca_dev *dev)
|
||||
|
||||
mthca_UNMAP_ICM(dev, mthca_uarc_virt(dev, &dev->driver_uar, i), 1, &status);
|
||||
|
||||
dma_free_coherent(&dev->pdev->dev, 4096,
|
||||
dma_free_coherent(&dev->pdev->dev, MTHCA_ICM_PAGE_SIZE,
|
||||
dev->db_tab->page[i].db_rec,
|
||||
dev->db_tab->page[i].mapping);
|
||||
}
|
||||
|
Reference in New Issue
Block a user