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

IB/mlx5: Fix integer overflow when page_shift == 31

Fix a bug where MR registration fails when mlx5_ib_cont_pages
indicates that the MR can be mapped using 2GB pages (page_shift == 31).

Fixes: e126ba97dba9 ("mlx5: Add driver for Mellanox Connect-IB adapters")
Signed-off-by: Ilya Lesokhin <ilyal@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>

authored by

Ilya Lesokhin and committed by
Doug Ledford
7b4cdaae 5942d8ae

+5 -4
+5 -4
drivers/infiniband/hw/mlx5/mr.c
··· 808 808 return ERR_PTR(err); 809 809 } 810 810 811 - static int get_octo_len(u64 addr, u64 len, int page_size) 811 + static int get_octo_len(u64 addr, u64 len, int page_shift) 812 812 { 813 + u64 page_size = 1ULL << page_shift; 813 814 u64 offset; 814 815 int npages; 815 816 816 817 offset = addr & (page_size - 1); 817 - npages = ALIGN(len + offset, page_size) >> ilog2(page_size); 818 + npages = ALIGN(len + offset, page_size) >> page_shift; 818 819 return (npages + 1) / 2; 819 820 } 820 821 ··· 1148 1147 MLX5_SET(mkc, mkc, pd, to_mpd(pd)->pdn); 1149 1148 MLX5_SET(mkc, mkc, bsf_octword_size, 0); 1150 1149 MLX5_SET(mkc, mkc, translations_octword_size, 1151 - get_octo_len(virt_addr, length, 1 << page_shift)); 1150 + get_octo_len(virt_addr, length, page_shift)); 1152 1151 MLX5_SET(mkc, mkc, log_page_size, page_shift); 1153 1152 MLX5_SET(mkc, mkc, qpn, 0xffffff); 1154 1153 if (populate) { 1155 1154 MLX5_SET(create_mkey_in, in, translations_octword_actual_size, 1156 - get_octo_len(virt_addr, length, 1 << page_shift)); 1155 + get_octo_len(virt_addr, length, page_shift)); 1157 1156 } 1158 1157 1159 1158 err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen);