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

Configure Feed

Select the types of activity you want to include in your feed.

RDMA/core: Expose pkeys sysfs files only if pkey_tbl_len is set

Expose the pkeys sysfs files only if the pkey_tbl_len is set by the
providers.

Link: https://lore.kernel.org/r/20200714183414.61069-2-kamalheib1@gmail.com
Signed-off-by: Kamal Heib <kamalheib1@gmail.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>

authored by

Kamal Heib and committed by
Jason Gunthorpe
90efc8b2 5f0b2a60

+41 -20
+41 -20
drivers/infiniband/core/sysfs.c
··· 58 58 struct ib_device *ibdev; 59 59 struct gid_attr_group *gid_attr_group; 60 60 struct attribute_group gid_group; 61 - struct attribute_group pkey_group; 61 + struct attribute_group *pkey_group; 62 62 struct attribute_group *pma_table; 63 63 struct attribute_group *hw_stats_ag; 64 64 struct rdma_hw_stats *hw_stats; ··· 681 681 kfree(p->gid_group.attrs); 682 682 } 683 683 684 - if (p->pkey_group.attrs) { 685 - for (i = 0; (a = p->pkey_group.attrs[i]); ++i) 686 - kfree(a); 684 + if (p->pkey_group) { 685 + if (p->pkey_group->attrs) { 686 + for (i = 0; (a = p->pkey_group->attrs[i]); ++i) 687 + kfree(a); 687 688 688 - kfree(p->pkey_group.attrs); 689 + kfree(p->pkey_group->attrs); 690 + } 691 + 692 + kfree(p->pkey_group); 693 + p->pkey_group = NULL; 689 694 } 690 695 691 696 kfree(p); ··· 1123 1118 if (ret) 1124 1119 goto err_free_gid_type; 1125 1120 1126 - p->pkey_group.name = "pkeys"; 1127 - p->pkey_group.attrs = alloc_group_attrs(show_port_pkey, 1128 - attr.pkey_tbl_len); 1129 - if (!p->pkey_group.attrs) { 1130 - ret = -ENOMEM; 1131 - goto err_remove_gid_type; 1121 + if (attr.pkey_tbl_len) { 1122 + p->pkey_group = kzalloc(sizeof(*p->pkey_group), GFP_KERNEL); 1123 + if (!p->pkey_group) { 1124 + ret = -ENOMEM; 1125 + goto err_remove_gid_type; 1126 + } 1127 + 1128 + p->pkey_group->name = "pkeys"; 1129 + p->pkey_group->attrs = alloc_group_attrs(show_port_pkey, 1130 + attr.pkey_tbl_len); 1131 + if (!p->pkey_group->attrs) { 1132 + ret = -ENOMEM; 1133 + goto err_free_pkey_group; 1134 + } 1135 + 1136 + ret = sysfs_create_group(&p->kobj, p->pkey_group); 1137 + if (ret) 1138 + goto err_free_pkey; 1132 1139 } 1133 1140 1134 - ret = sysfs_create_group(&p->kobj, &p->pkey_group); 1135 - if (ret) 1136 - goto err_free_pkey; 1137 1141 1138 1142 if (device->ops.init_port && is_full_dev) { 1139 1143 ret = device->ops.init_port(device, port_num, &p->kobj); ··· 1164 1150 return 0; 1165 1151 1166 1152 err_remove_pkey: 1167 - sysfs_remove_group(&p->kobj, &p->pkey_group); 1153 + if (p->pkey_group) 1154 + sysfs_remove_group(&p->kobj, p->pkey_group); 1168 1155 1169 1156 err_free_pkey: 1170 - for (i = 0; i < attr.pkey_tbl_len; ++i) 1171 - kfree(p->pkey_group.attrs[i]); 1157 + if (p->pkey_group) { 1158 + for (i = 0; i < attr.pkey_tbl_len; ++i) 1159 + kfree(p->pkey_group->attrs[i]); 1172 1160 1173 - kfree(p->pkey_group.attrs); 1174 - p->pkey_group.attrs = NULL; 1161 + kfree(p->pkey_group->attrs); 1162 + p->pkey_group->attrs = NULL; 1163 + } 1164 + 1165 + err_free_pkey_group: 1166 + kfree(p->pkey_group); 1175 1167 1176 1168 err_remove_gid_type: 1177 1169 sysfs_remove_group(&p->gid_attr_group->kobj, ··· 1337 1317 1338 1318 if (port->pma_table) 1339 1319 sysfs_remove_group(p, port->pma_table); 1340 - sysfs_remove_group(p, &port->pkey_group); 1320 + if (port->pkey_group) 1321 + sysfs_remove_group(p, port->pkey_group); 1341 1322 sysfs_remove_group(p, &port->gid_group); 1342 1323 sysfs_remove_group(&port->gid_attr_group->kobj, 1343 1324 &port->gid_attr_group->ndev);