Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

IB/mthca: Merge MR and FMR space on 64-bit systems

For Tavor, we currently reserve separate MPT and MTT space for FMRs to
avoid abusing the vmalloc space on 32 bit kernels. No such problem
exists on 64 bit kernels so let's not do it there.

This way we have a shared pool for MR and FMR resources, used on
demand. This will also make it possible to write MTTs for regular
regions directly from driver.

Signed-off-by: Michael S. Tsirkin <mst@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>

authored by

Michael S. Tsirkin and committed by
Roland Dreier
c20e20ab 391e4dea

+16 -6
+15 -5
drivers/infiniband/hw/mthca/mthca_mr.c
··· 765 765 int mthca_init_mr_table(struct mthca_dev *dev) 766 766 { 767 767 unsigned long addr; 768 - int err, i; 768 + int mpts, mtts, err, i; 769 769 770 770 err = mthca_alloc_init(&dev->mr_table.mpt_alloc, 771 771 dev->limits.num_mpts, ··· 799 799 err = -EINVAL; 800 800 goto err_fmr_mpt; 801 801 } 802 + mpts = mtts = 1 << i; 803 + } else { 804 + mpts = dev->limits.num_mtt_segs; 805 + mtts = dev->limits.num_mpts; 806 + } 807 + 808 + if (!mthca_is_memfree(dev) && 809 + (dev->mthca_flags & MTHCA_FLAG_FMR)) { 802 810 803 811 addr = pci_resource_start(dev->pdev, 4) + 804 812 ((pci_resource_len(dev->pdev, 4) - 1) & 805 813 dev->mr_table.mpt_base); 806 814 807 815 dev->mr_table.tavor_fmr.mpt_base = 808 - ioremap(addr, (1 << i) * sizeof(struct mthca_mpt_entry)); 816 + ioremap(addr, mpts * sizeof(struct mthca_mpt_entry)); 809 817 810 818 if (!dev->mr_table.tavor_fmr.mpt_base) { 811 819 mthca_warn(dev, "MPT ioremap for FMR failed.\n"); ··· 826 818 dev->mr_table.mtt_base); 827 819 828 820 dev->mr_table.tavor_fmr.mtt_base = 829 - ioremap(addr, (1 << i) * MTHCA_MTT_SEG_SIZE); 821 + ioremap(addr, mtts * MTHCA_MTT_SEG_SIZE); 830 822 if (!dev->mr_table.tavor_fmr.mtt_base) { 831 823 mthca_warn(dev, "MTT ioremap for FMR failed.\n"); 832 824 err = -ENOMEM; 833 825 goto err_fmr_mtt; 834 826 } 827 + } 835 828 836 - err = mthca_buddy_init(&dev->mr_table.tavor_fmr.mtt_buddy, i); 829 + if (dev->limits.fmr_reserved_mtts) { 830 + err = mthca_buddy_init(&dev->mr_table.tavor_fmr.mtt_buddy, fls(mtts - 1)); 837 831 if (err) 838 832 goto err_fmr_mtt_buddy; 839 833 840 834 /* Prevent regular MRs from using FMR keys */ 841 - err = mthca_buddy_alloc(&dev->mr_table.mtt_buddy, i); 835 + err = mthca_buddy_alloc(&dev->mr_table.mtt_buddy, fls(mtts - 1)); 842 836 if (err) 843 837 goto err_reserve_fmr; 844 838
+1 -1
drivers/infiniband/hw/mthca/mthca_profile.c
··· 277 277 * out of the MR pool. They don't use additional memory, but 278 278 * we assign them as part of the HCA profile anyway. 279 279 */ 280 - if (mthca_is_memfree(dev)) 280 + if (mthca_is_memfree(dev) || BITS_PER_LONG == 64) 281 281 dev->limits.fmr_reserved_mtts = 0; 282 282 else 283 283 dev->limits.fmr_reserved_mtts = request->fmr_reserved_mtts;