main.c (5fe9dec0d045437e48f112b8fa705197bd7bc3c0) | main.c (b037c29a8056b8e896c4e084ba7cc30d6a1f165f) |
---|---|
1/* 2 * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 978 unchanged lines hidden (view full) --- 987 988 err = mlx5_set_port_caps(dev->mdev, port, tmp); 989 990out: 991 mutex_unlock(&dev->cap_mask_mutex); 992 return err; 993} 994 | 1/* 2 * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 978 unchanged lines hidden (view full) --- 987 988 err = mlx5_set_port_caps(dev->mdev, port, tmp); 989 990out: 991 mutex_unlock(&dev->cap_mask_mutex); 992 return err; 993} 994 |
995static int calc_total_bfregs(struct mlx5_ib_dev *dev, bool lib_uar_4k, 996 struct mlx5_ib_alloc_ucontext_req_v2 *req, 997 u32 *num_sys_pages) 998{ 999 int uars_per_sys_page; 1000 int bfregs_per_sys_page; 1001 int ref_bfregs = req->total_num_bfregs; 1002 1003 if (req->total_num_bfregs == 0) 1004 return -EINVAL; 1005 1006 BUILD_BUG_ON(MLX5_MAX_BFREGS % MLX5_NON_FP_BFREGS_IN_PAGE); 1007 BUILD_BUG_ON(MLX5_MAX_BFREGS < MLX5_NON_FP_BFREGS_IN_PAGE); 1008 1009 if (req->total_num_bfregs > MLX5_MAX_BFREGS) 1010 return -ENOMEM; 1011 1012 uars_per_sys_page = get_uars_per_sys_page(dev, lib_uar_4k); 1013 bfregs_per_sys_page = uars_per_sys_page * MLX5_NON_FP_BFREGS_PER_UAR; 1014 req->total_num_bfregs = ALIGN(req->total_num_bfregs, bfregs_per_sys_page); 1015 *num_sys_pages = req->total_num_bfregs / bfregs_per_sys_page; 1016 1017 if (req->num_low_latency_bfregs > req->total_num_bfregs - 1) 1018 return -EINVAL; 1019 1020 mlx5_ib_dbg(dev, "uar_4k: fw support %s, lib support %s, user requested %d bfregs, alloated %d, using %d sys pages\n", 1021 MLX5_CAP_GEN(dev->mdev, uar_4k) ? "yes" : "no", 1022 lib_uar_4k ? "yes" : "no", ref_bfregs, 1023 req->total_num_bfregs, *num_sys_pages); 1024 1025 return 0; 1026} 1027 1028static int allocate_uars(struct mlx5_ib_dev *dev, struct mlx5_ib_ucontext *context) 1029{ 1030 struct mlx5_bfreg_info *bfregi; 1031 int err; 1032 int i; 1033 1034 bfregi = &context->bfregi; 1035 for (i = 0; i < bfregi->num_sys_pages; i++) { 1036 err = mlx5_cmd_alloc_uar(dev->mdev, &bfregi->sys_pages[i]); 1037 if (err) 1038 goto error; 1039 1040 mlx5_ib_dbg(dev, "allocated uar %d\n", bfregi->sys_pages[i]); 1041 } 1042 return 0; 1043 1044error: 1045 for (--i; i >= 0; i--) 1046 if (mlx5_cmd_free_uar(dev->mdev, bfregi->sys_pages[i])) 1047 mlx5_ib_warn(dev, "failed to free uar %d\n", i); 1048 1049 return err; 1050} 1051 1052static int deallocate_uars(struct mlx5_ib_dev *dev, struct mlx5_ib_ucontext *context) 1053{ 1054 struct mlx5_bfreg_info *bfregi; 1055 int err; 1056 int i; 1057 1058 bfregi = &context->bfregi; 1059 for (i = 0; i < bfregi->num_sys_pages; i++) { 1060 err = mlx5_cmd_free_uar(dev->mdev, bfregi->sys_pages[i]); 1061 if (err) { 1062 mlx5_ib_warn(dev, "failed to free uar %d\n", i); 1063 return err; 1064 } 1065 } 1066 return 0; 1067} 1068 |
|
995static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, 996 struct ib_udata *udata) 997{ 998 struct mlx5_ib_dev *dev = to_mdev(ibdev); 999 struct mlx5_ib_alloc_ucontext_req_v2 req = {}; 1000 struct mlx5_ib_alloc_ucontext_resp resp = {}; 1001 struct mlx5_ib_ucontext *context; 1002 struct mlx5_bfreg_info *bfregi; | 1069static struct ib_ucontext *mlx5_ib_alloc_ucontext(struct ib_device *ibdev, 1070 struct ib_udata *udata) 1071{ 1072 struct mlx5_ib_dev *dev = to_mdev(ibdev); 1073 struct mlx5_ib_alloc_ucontext_req_v2 req = {}; 1074 struct mlx5_ib_alloc_ucontext_resp resp = {}; 1075 struct mlx5_ib_ucontext *context; 1076 struct mlx5_bfreg_info *bfregi; |
1003 struct mlx5_uar *uars; 1004 int gross_bfregs; 1005 int num_uars; | |
1006 int ver; | 1077 int ver; |
1007 int bfregn; | |
1008 int err; | 1078 int err; |
1009 int i; | |
1010 size_t reqlen; 1011 size_t min_req_v2 = offsetof(struct mlx5_ib_alloc_ucontext_req_v2, 1012 max_cqe_version); | 1079 size_t reqlen; 1080 size_t min_req_v2 = offsetof(struct mlx5_ib_alloc_ucontext_req_v2, 1081 max_cqe_version); |
1082 bool lib_uar_4k; |
|
1013 1014 if (!dev->ib_active) 1015 return ERR_PTR(-EAGAIN); 1016 1017 if (udata->inlen < sizeof(struct ib_uverbs_cmd_hdr)) 1018 return ERR_PTR(-EINVAL); 1019 1020 reqlen = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr); --- 6 unchanged lines hidden (view full) --- 1027 1028 err = ib_copy_from_udata(&req, udata, min(reqlen, sizeof(req))); 1029 if (err) 1030 return ERR_PTR(err); 1031 1032 if (req.flags) 1033 return ERR_PTR(-EINVAL); 1034 | 1083 1084 if (!dev->ib_active) 1085 return ERR_PTR(-EAGAIN); 1086 1087 if (udata->inlen < sizeof(struct ib_uverbs_cmd_hdr)) 1088 return ERR_PTR(-EINVAL); 1089 1090 reqlen = udata->inlen - sizeof(struct ib_uverbs_cmd_hdr); --- 6 unchanged lines hidden (view full) --- 1097 1098 err = ib_copy_from_udata(&req, udata, min(reqlen, sizeof(req))); 1099 if (err) 1100 return ERR_PTR(err); 1101 1102 if (req.flags) 1103 return ERR_PTR(-EINVAL); 1104 |
1035 if (req.total_num_bfregs > MLX5_MAX_BFREGS) 1036 return ERR_PTR(-ENOMEM); 1037 1038 if (req.total_num_bfregs == 0) 1039 return ERR_PTR(-EINVAL); 1040 | |
1041 if (req.comp_mask || req.reserved0 || req.reserved1 || req.reserved2) 1042 return ERR_PTR(-EOPNOTSUPP); 1043 | 1105 if (req.comp_mask || req.reserved0 || req.reserved1 || req.reserved2) 1106 return ERR_PTR(-EOPNOTSUPP); 1107 |
1044 if (reqlen > sizeof(req) && 1045 !ib_is_udata_cleared(udata, sizeof(req), 1046 reqlen - sizeof(req))) 1047 return ERR_PTR(-EOPNOTSUPP); 1048 | |
1049 req.total_num_bfregs = ALIGN(req.total_num_bfregs, 1050 MLX5_NON_FP_BFREGS_PER_UAR); 1051 if (req.num_low_latency_bfregs > req.total_num_bfregs - 1) 1052 return ERR_PTR(-EINVAL); 1053 | 1108 req.total_num_bfregs = ALIGN(req.total_num_bfregs, 1109 MLX5_NON_FP_BFREGS_PER_UAR); 1110 if (req.num_low_latency_bfregs > req.total_num_bfregs - 1) 1111 return ERR_PTR(-EINVAL); 1112 |
1054 num_uars = req.total_num_bfregs / MLX5_NON_FP_BFREGS_PER_UAR; 1055 gross_bfregs = num_uars * MLX5_BFREGS_PER_UAR; | |
1056 resp.qp_tab_size = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp); 1057 if (mlx5_core_is_pf(dev->mdev) && MLX5_CAP_GEN(dev->mdev, bf)) 1058 resp.bf_reg_size = 1 << MLX5_CAP_GEN(dev->mdev, log_bf_reg_size); 1059 resp.cache_line_size = cache_line_size(); 1060 resp.max_sq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_sq); 1061 resp.max_rq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_rq); 1062 resp.max_send_wqebb = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz); 1063 resp.max_recv_wr = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz); 1064 resp.max_srq_recv_wr = 1 << MLX5_CAP_GEN(dev->mdev, log_max_srq_sz); 1065 resp.cqe_version = min_t(__u8, 1066 (__u8)MLX5_CAP_GEN(dev->mdev, cqe_version), 1067 req.max_cqe_version); 1068 resp.response_length = min(offsetof(typeof(resp), response_length) + 1069 sizeof(resp.response_length), udata->outlen); 1070 1071 context = kzalloc(sizeof(*context), GFP_KERNEL); 1072 if (!context) 1073 return ERR_PTR(-ENOMEM); 1074 | 1113 resp.qp_tab_size = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp); 1114 if (mlx5_core_is_pf(dev->mdev) && MLX5_CAP_GEN(dev->mdev, bf)) 1115 resp.bf_reg_size = 1 << MLX5_CAP_GEN(dev->mdev, log_bf_reg_size); 1116 resp.cache_line_size = cache_line_size(); 1117 resp.max_sq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_sq); 1118 resp.max_rq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_rq); 1119 resp.max_send_wqebb = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz); 1120 resp.max_recv_wr = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz); 1121 resp.max_srq_recv_wr = 1 << MLX5_CAP_GEN(dev->mdev, log_max_srq_sz); 1122 resp.cqe_version = min_t(__u8, 1123 (__u8)MLX5_CAP_GEN(dev->mdev, cqe_version), 1124 req.max_cqe_version); 1125 resp.response_length = min(offsetof(typeof(resp), response_length) + 1126 sizeof(resp.response_length), udata->outlen); 1127 1128 context = kzalloc(sizeof(*context), GFP_KERNEL); 1129 if (!context) 1130 return ERR_PTR(-ENOMEM); 1131 |
1132 lib_uar_4k = false; |
|
1075 bfregi = &context->bfregi; | 1133 bfregi = &context->bfregi; |
1076 mutex_init(&bfregi->lock); 1077 uars = kcalloc(num_uars, sizeof(*uars), GFP_KERNEL); 1078 if (!uars) { 1079 err = -ENOMEM; | 1134 1135 /* updates req->total_num_bfregs */ 1136 err = calc_total_bfregs(dev, lib_uar_4k, &req, &bfregi->num_sys_pages); 1137 if (err) |
1080 goto out_ctx; | 1138 goto out_ctx; |
1081 } | |
1082 | 1139 |
1083 bfregi->bitmap = kcalloc(BITS_TO_LONGS(gross_bfregs), 1084 sizeof(*bfregi->bitmap), | 1140 mutex_init(&bfregi->lock); 1141 bfregi->lib_uar_4k = lib_uar_4k; 1142 bfregi->count = kcalloc(req.total_num_bfregs, sizeof(*bfregi->count), |
1085 GFP_KERNEL); | 1143 GFP_KERNEL); |
1086 if (!bfregi->bitmap) { | 1144 if (!bfregi->count) { |
1087 err = -ENOMEM; | 1145 err = -ENOMEM; |
1088 goto out_uar_ctx; | 1146 goto out_ctx; |
1089 } | 1147 } |
1090 /* 1091 * clear all fast path bfregs 1092 */ 1093 for (i = 0; i < gross_bfregs; i++) { 1094 bfregn = i & 3; 1095 if (bfregn == 2 || bfregn == 3) 1096 set_bit(i, bfregi->bitmap); 1097 } | |
1098 | 1148 |
1099 bfregi->count = kcalloc(gross_bfregs, 1100 sizeof(*bfregi->count), GFP_KERNEL); 1101 if (!bfregi->count) { | 1149 bfregi->sys_pages = kcalloc(bfregi->num_sys_pages, 1150 sizeof(*bfregi->sys_pages), 1151 GFP_KERNEL); 1152 if (!bfregi->sys_pages) { |
1102 err = -ENOMEM; | 1153 err = -ENOMEM; |
1103 goto out_bitmap; | 1154 goto out_count; |
1104 } 1105 | 1155 } 1156 |
1106 for (i = 0; i < num_uars; i++) { 1107 err = mlx5_cmd_alloc_uar(dev->mdev, &uars[i].index); 1108 if (err) 1109 goto out_count; 1110 } | 1157 err = allocate_uars(dev, context); 1158 if (err) 1159 goto out_sys_pages; |
1111 1112#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 1113 context->ibucontext.invalidate_range = &mlx5_ib_invalidate_range; 1114#endif 1115 1116 context->upd_xlt_page = __get_free_page(GFP_KERNEL); 1117 if (!context->upd_xlt_page) { 1118 err = -ENOMEM; --- 42 unchanged lines hidden (view full) --- 1161 } 1162 1163 err = ib_copy_to_udata(udata, &resp, resp.response_length); 1164 if (err) 1165 goto out_td; 1166 1167 bfregi->ver = ver; 1168 bfregi->num_low_latency_bfregs = req.num_low_latency_bfregs; | 1160 1161#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 1162 context->ibucontext.invalidate_range = &mlx5_ib_invalidate_range; 1163#endif 1164 1165 context->upd_xlt_page = __get_free_page(GFP_KERNEL); 1166 if (!context->upd_xlt_page) { 1167 err = -ENOMEM; --- 42 unchanged lines hidden (view full) --- 1210 } 1211 1212 err = ib_copy_to_udata(udata, &resp, resp.response_length); 1213 if (err) 1214 goto out_td; 1215 1216 bfregi->ver = ver; 1217 bfregi->num_low_latency_bfregs = req.num_low_latency_bfregs; |
1169 bfregi->uars = uars; 1170 bfregi->num_uars = num_uars; | |
1171 context->cqe_version = resp.cqe_version; | 1218 context->cqe_version = resp.cqe_version; |
1219 context->lib_caps = false; |
|
1172 1173 return &context->ibucontext; 1174 1175out_td: 1176 if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain)) 1177 mlx5_core_dealloc_transport_domain(dev->mdev, context->tdn); 1178 1179out_page: 1180 free_page(context->upd_xlt_page); 1181 1182out_uars: | 1220 1221 return &context->ibucontext; 1222 1223out_td: 1224 if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain)) 1225 mlx5_core_dealloc_transport_domain(dev->mdev, context->tdn); 1226 1227out_page: 1228 free_page(context->upd_xlt_page); 1229 1230out_uars: |
1183 for (i--; i >= 0; i--) 1184 mlx5_cmd_free_uar(dev->mdev, uars[i].index); | 1231 deallocate_uars(dev, context); 1232 1233out_sys_pages: 1234 kfree(bfregi->sys_pages); 1235 |
1185out_count: 1186 kfree(bfregi->count); 1187 | 1236out_count: 1237 kfree(bfregi->count); 1238 |
1188out_bitmap: 1189 kfree(bfregi->bitmap); 1190 1191out_uar_ctx: 1192 kfree(uars); 1193 | |
1194out_ctx: 1195 kfree(context); | 1239out_ctx: 1240 kfree(context); |
1241 |
|
1196 return ERR_PTR(err); 1197} 1198 1199static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext) 1200{ 1201 struct mlx5_ib_ucontext *context = to_mucontext(ibcontext); 1202 struct mlx5_ib_dev *dev = to_mdev(ibcontext->device); | 1242 return ERR_PTR(err); 1243} 1244 1245static int mlx5_ib_dealloc_ucontext(struct ib_ucontext *ibcontext) 1246{ 1247 struct mlx5_ib_ucontext *context = to_mucontext(ibcontext); 1248 struct mlx5_ib_dev *dev = to_mdev(ibcontext->device); |
1203 struct mlx5_bfreg_info *bfregi = &context->bfregi; 1204 int i; | 1249 struct mlx5_bfreg_info *bfregi; |
1205 | 1250 |
1251 bfregi = &context->bfregi; |
|
1206 if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain)) 1207 mlx5_core_dealloc_transport_domain(dev->mdev, context->tdn); 1208 1209 free_page(context->upd_xlt_page); | 1252 if (MLX5_CAP_GEN(dev->mdev, log_max_transport_domain)) 1253 mlx5_core_dealloc_transport_domain(dev->mdev, context->tdn); 1254 1255 free_page(context->upd_xlt_page); |
1210 1211 for (i = 0; i < bfregi->num_uars; i++) { 1212 if (mlx5_cmd_free_uar(dev->mdev, bfregi->uars[i].index)) 1213 mlx5_ib_warn(dev, "Failed to free UAR 0x%x\n", 1214 bfregi->uars[i].index); 1215 } 1216 | 1256 deallocate_uars(dev, context); 1257 kfree(bfregi->sys_pages); |
1217 kfree(bfregi->count); | 1258 kfree(bfregi->count); |
1218 kfree(bfregi->bitmap); 1219 kfree(bfregi->uars); | |
1220 kfree(context); 1221 1222 return 0; 1223} 1224 | 1259 kfree(context); 1260 1261 return 0; 1262} 1263 |
1225static phys_addr_t uar_index2pfn(struct mlx5_ib_dev *dev, int index) | 1264static phys_addr_t uar_index2pfn(struct mlx5_ib_dev *dev, 1265 struct mlx5_bfreg_info *bfregi, 1266 int idx) |
1226{ | 1267{ |
1227 return (pci_resource_start(dev->mdev->pdev, 0) >> PAGE_SHIFT) + index; | 1268 int fw_uars_per_page; 1269 1270 fw_uars_per_page = MLX5_CAP_GEN(dev->mdev, uar_4k) ? MLX5_UARS_IN_PAGE : 1; 1271 1272 return (pci_resource_start(dev->mdev->pdev, 0) >> PAGE_SHIFT) + 1273 bfregi->sys_pages[idx] / fw_uars_per_page; |
1228} 1229 1230static int get_command(unsigned long offset) 1231{ 1232 return (offset >> MLX5_IB_MMAP_CMD_SHIFT) & MLX5_IB_MMAP_CMD_MASK; 1233} 1234 1235static int get_arg(unsigned long offset) --- 143 unchanged lines hidden (view full) --- 1379 struct vm_area_struct *vma, 1380 struct mlx5_ib_ucontext *context) 1381{ 1382 struct mlx5_bfreg_info *bfregi = &context->bfregi; 1383 int err; 1384 unsigned long idx; 1385 phys_addr_t pfn, pa; 1386 pgprot_t prot; | 1274} 1275 1276static int get_command(unsigned long offset) 1277{ 1278 return (offset >> MLX5_IB_MMAP_CMD_SHIFT) & MLX5_IB_MMAP_CMD_MASK; 1279} 1280 1281static int get_arg(unsigned long offset) --- 143 unchanged lines hidden (view full) --- 1425 struct vm_area_struct *vma, 1426 struct mlx5_ib_ucontext *context) 1427{ 1428 struct mlx5_bfreg_info *bfregi = &context->bfregi; 1429 int err; 1430 unsigned long idx; 1431 phys_addr_t pfn, pa; 1432 pgprot_t prot; |
1433 int uars_per_page; |
|
1387 | 1434 |
1435 if (vma->vm_end - vma->vm_start != PAGE_SIZE) 1436 return -EINVAL; 1437 1438 uars_per_page = get_uars_per_sys_page(dev, bfregi->lib_uar_4k); 1439 idx = get_index(vma->vm_pgoff); 1440 if (idx % uars_per_page || 1441 idx * uars_per_page >= bfregi->num_sys_pages) { 1442 mlx5_ib_warn(dev, "invalid uar index %lu\n", idx); 1443 return -EINVAL; 1444 } 1445 |
|
1388 switch (cmd) { 1389 case MLX5_IB_MMAP_WC_PAGE: 1390/* Some architectures don't support WC memory */ 1391#if defined(CONFIG_X86) 1392 if (!pat_enabled()) 1393 return -EPERM; 1394#elif !(defined(CONFIG_PPC) || (defined(CONFIG_ARM) && defined(CONFIG_MMU))) 1395 return -EPERM; --- 5 unchanged lines hidden (view full) --- 1401 break; 1402 case MLX5_IB_MMAP_NC_PAGE: 1403 prot = pgprot_noncached(vma->vm_page_prot); 1404 break; 1405 default: 1406 return -EINVAL; 1407 } 1408 | 1446 switch (cmd) { 1447 case MLX5_IB_MMAP_WC_PAGE: 1448/* Some architectures don't support WC memory */ 1449#if defined(CONFIG_X86) 1450 if (!pat_enabled()) 1451 return -EPERM; 1452#elif !(defined(CONFIG_PPC) || (defined(CONFIG_ARM) && defined(CONFIG_MMU))) 1453 return -EPERM; --- 5 unchanged lines hidden (view full) --- 1459 break; 1460 case MLX5_IB_MMAP_NC_PAGE: 1461 prot = pgprot_noncached(vma->vm_page_prot); 1462 break; 1463 default: 1464 return -EINVAL; 1465 } 1466 |
1409 if (vma->vm_end - vma->vm_start != PAGE_SIZE) 1410 return -EINVAL; 1411 1412 idx = get_index(vma->vm_pgoff); 1413 if (idx >= bfregi->num_uars) 1414 return -EINVAL; 1415 1416 pfn = uar_index2pfn(dev, bfregi->uars[idx].index); | 1467 pfn = uar_index2pfn(dev, bfregi, idx); |
1417 mlx5_ib_dbg(dev, "uar idx 0x%lx, pfn %pa\n", idx, &pfn); 1418 1419 vma->vm_page_prot = prot; 1420 err = io_remap_pfn_range(vma, vma->vm_start, pfn, 1421 PAGE_SIZE, vma->vm_page_prot); 1422 if (err) { 1423 mlx5_ib_err(dev, "io_remap_pfn_range failed with error=%d, vm_start=0x%lx, pfn=%pa, mmap_cmd=%s\n", 1424 err, vma->vm_start, &pfn, mmap_cmd2str(cmd)); --- 1946 unchanged lines hidden --- | 1468 mlx5_ib_dbg(dev, "uar idx 0x%lx, pfn %pa\n", idx, &pfn); 1469 1470 vma->vm_page_prot = prot; 1471 err = io_remap_pfn_range(vma, vma->vm_start, pfn, 1472 PAGE_SIZE, vma->vm_page_prot); 1473 if (err) { 1474 mlx5_ib_err(dev, "io_remap_pfn_range failed with error=%d, vm_start=0x%lx, pfn=%pa, mmap_cmd=%s\n", 1475 err, vma->vm_start, &pfn, mmap_cmd2str(cmd)); --- 1946 unchanged lines hidden --- |