@@ -230,5 +230,6 @@ static inline int ib_security_open_shared_qp(struct ib_qp *qp,
static inline void ib_security_close_shared_qp(struct ib_qp_security *sec)
{
}
-#endif
+
+#endif /* CONFIG_SECURITY_INFINIBAND */
#endif /* _CORE_PRIV_H */
@@ -581,7 +581,6 @@ void ib_security_cache_change(struct ib_device *device,
u64 subnet_prefix)
{
struct pkey_index_qp_list *pkey;
-
list_for_each_entry(pkey,
&device->port_pkey_list[port_num].pkey_list,
pkey_index_list) {
@@ -665,5 +664,4 @@ int ib_security_enforce_mad_agent_pkey_access(struct ib_device *dev,
return security_mad_agent_pkey_access(subnet_prefix, pkey, mad_agent);
}
EXPORT_SYMBOL(ib_security_enforce_mad_agent_pkey_access);
-
-#endif /* CONFIG_SECURITY_INFINIBAND */
+#endif
@@ -335,6 +335,29 @@ static int setup_port_pkey_list(struct ib_device *device)
return 0;
}
+static void ib_security_flush(void)
+{
+ struct ib_device *dev;
+
+ down_read(&lists_rwsem);
+ list_for_each_entry(dev, &device_list, core_list) {
+ int i;
+
+ for (i = rdma_start_port(dev); i <= rdma_end_port(dev); i++) {
+ u64 sp;
+ int ret = ib_get_cached_subnet_prefix(dev,
+ i,
+ &sp);
+
+ WARN_ONCE(ret,
+ "ib_get_cached_subnet_prefix err: %d, this should never happen here\n",
+ ret);
+ ib_security_cache_change(dev, i, sp);
+ }
+ }
+ up_read(&lists_rwsem);
+}
+
/**
* ib_register_device - Register an IB device with IB core
* @device:Device to register
@@ -1016,6 +1039,8 @@ static int __init ib_core_init(void)
goto err_sysfs;
}
+ security_register_ib_flush_callback(&ib_security_flush);
+
ib_cache_setup();
return 0;
@@ -1031,6 +1056,7 @@ err:
static void __exit ib_core_cleanup(void)
{
+ security_unregister_ib_flush_callback();
ib_cache_cleanup();
ibnl_cleanup();
class_unregister(&ib_class);