-+#define AuCacheFuncs(name, index) \
-+static inline struct au_##name *au_cache_alloc_##name(void) \
-+{ return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \
-+static inline void au_cache_free_##name(struct au_##name *p) \
-+{ kmem_cache_free(au_cache[AuCache_##index], p); }
++#define AuCacheFuncs(name, index) \
++ static inline struct au_##name *au_cache_alloc_##name(void) \
++ { return kmem_cache_alloc(au_cache[AuCache_##index], GFP_NOFS); } \
++ static inline void au_cache_free_##name##_norcu(struct au_##name *p) \
++ { kmem_cache_free(au_cache[AuCache_##index], p); } \
++ \
++ static inline void au_cache_free_##name##_rcu_cb(struct rcu_head *rcu) \
++ { void *p = rcu; \
++ p -= offsetof(struct au_##name, rcu); \
++ kmem_cache_free(au_cache[AuCache_##index], p); } \
++ static inline void au_cache_free_##name##_rcu(struct au_##name *p) \
++ { BUILD_BUG_ON(sizeof(struct au_##name) < sizeof(struct rcu_head)); \
++ call_rcu(&p->rcu, au_cache_free_##name##_rcu_cb); } \
++ \
++ static inline void au_cache_free_##name(struct au_##name *p) \
++ { /* au_cache_free_##name##_norcu(p); */ \
++ au_cache_free_##name##_rcu(p); }