|
@@ -809,4 +809,60 @@ static inline void debug_rcu_head_unqueue(struct rcu_head *head)
|
|
|
}
|
|
|
#endif /* #else !CONFIG_DEBUG_OBJECTS_RCU_HEAD */
|
|
|
|
|
|
+static __always_inline bool __is_kfree_rcu_offset(unsigned long offset)
|
|
|
+{
|
|
|
+ return offset < 4096;
|
|
|
+}
|
|
|
+
|
|
|
+static __always_inline
|
|
|
+void __kfree_rcu(struct rcu_head *head, unsigned long offset)
|
|
|
+{
|
|
|
+ typedef void (*rcu_callback)(struct rcu_head *);
|
|
|
+
|
|
|
+ BUILD_BUG_ON(!__builtin_constant_p(offset));
|
|
|
+
|
|
|
+ /* See the kfree_rcu() header comment. */
|
|
|
+ BUILD_BUG_ON(!__is_kfree_rcu_offset(offset));
|
|
|
+
|
|
|
+ call_rcu(head, (rcu_callback)offset);
|
|
|
+}
|
|
|
+
|
|
|
+extern void kfree(const void *);
|
|
|
+
|
|
|
+static inline void __rcu_reclaim(struct rcu_head *head)
|
|
|
+{
|
|
|
+ unsigned long offset = (unsigned long)head->func;
|
|
|
+
|
|
|
+ if (__is_kfree_rcu_offset(offset))
|
|
|
+ kfree((void *)head - offset);
|
|
|
+ else
|
|
|
+ head->func(head);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * kfree_rcu() - kfree an object after a grace period.
|
|
|
+ * @ptr: pointer to kfree
|
|
|
+ * @rcu_head: the name of the struct rcu_head within the type of @ptr.
|
|
|
+ *
|
|
|
+ * Many rcu callbacks functions just call kfree() on the base structure.
|
|
|
+ * These functions are trivial, but their size adds up, and furthermore
|
|
|
+ * when they are used in a kernel module, that module must invoke the
|
|
|
+ * high-latency rcu_barrier() function at module-unload time.
|
|
|
+ *
|
|
|
+ * The kfree_rcu() function handles this issue. Rather than encoding a
|
|
|
+ * function address in the embedded rcu_head structure, kfree_rcu() instead
|
|
|
+ * encodes the offset of the rcu_head structure within the base structure.
|
|
|
+ * Because the functions are not allowed in the low-order 4096 bytes of
|
|
|
+ * kernel virtual memory, offsets up to 4095 bytes can be accommodated.
|
|
|
+ * If the offset is larger than 4095 bytes, a compile-time error will
|
|
|
+ * be generated in __kfree_rcu(). If this error is triggered, you can
|
|
|
+ * either fall back to use of call_rcu() or rearrange the structure to
|
|
|
+ * position the rcu_head structure into the first 4096 bytes.
|
|
|
+ *
|
|
|
+ * Note that the allowable offset might decrease in the future, for example,
|
|
|
+ * to allow something like kmem_cache_free_rcu().
|
|
|
+ */
|
|
|
+#define kfree_rcu(ptr, rcu_head) \
|
|
|
+ __kfree_rcu(&((ptr)->rcu_head), offsetof(typeof(*(ptr)), rcu_head))
|
|
|
+
|
|
|
#endif /* __LINUX_RCUPDATE_H */
|