Re: [PATCH V2 1/5] xfsprogs: introduce liburcu support
From: Eric Sandeen <hidden>
Date: 2021-09-27 18:48:59
On 9/25/21 6:05 PM, Dave Chinner wrote:
quoted hunk ↗ jump to hunk
On Fri, Sep 24, 2021 at 04:51:32PM -0500, Eric Sandeen wrote:quoted
On 9/24/21 9:09 AM, Chandan Babu R wrote:quoted
From: Dave Chinner <redacted> The upcoming buffer cache rework/kerenl sync-up requires atomic variables. I could use C++11 atomics build into GCC, but they are a pain to work with and shoe-horn into the kernel atomic variable API. Much easier is to introduce a dependency on liburcu - the userspace RCU library. This provides atomic variables that very closely match the kernel atomic variable API, and it provides a very similar memory model and memory barrier support to the kernel. And we get RCU support that has an identical interface to the kernel and works the same way. Hence kernel code written with RCU algorithms and atomic variables will just slot straight into the userspace xfsprogs code without us having to think about whether the lockless algorithms will work in userspace or not. This reduces glue and hoop jumping, and gets us a step closer to having the entire userspace libxfs code MT safe. Signed-off-by: Dave Chinner <redacted> [chandan.babu@oracle.com: Add m4 macros to detect availability of liburcu]Thanks for fixing that up. I had tried to use rcu_init like Dave originally had, and I like that better in general, but I had trouble with it - I guess maybe it gets redefined based on memory model magic and the actual symbol "rcu_init" maybe isn't available? I didn't dig very much.Ah, so I just checked where the m4/package_urcu.m4 file went - forgot to re-add it after it rejected on apply. The diff is this:diff --git a/m4/package_urcu.m4 b/m4/package_urcu.m4 new file mode 100644 index 000000000000..9b0dee35d9a1 --- /dev/null +++ b/m4/package_urcu.m4@@ -0,0 +1,22 @@ +AC_DEFUN([AC_PACKAGE_NEED_URCU_H], + [ AC_CHECK_HEADERS(urcu.h) + if test $ac_cv_header_urcu_h = no; then + AC_CHECK_HEADERS(urcu.h,, [ + echo + echo 'FATAL ERROR: could not find a valid urcu header.' + exit 1]) + fi + ]) + +AC_DEFUN([AC_PACKAGE_NEED_RCU_INIT], + [ AC_MSG_CHECKING([for liburcu]) + AC_TRY_COMPILE([ +#define _GNU_SOURCE +#include <urcu.h> + ], [ + rcu_init(); + ], liburcu=-lurcu + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_SUBST(liburcu) + ])
Works great here too. My error was not including urcu.h in the test I think, and looking for the symbol directly. I will merge this version rather than Chandan's. Thanks, -Eric