); \
} while (0)
-/* atomic-context safe vfree */
-void libcfs_vfree_atomic(const void *addr);
-
-/* interval tree */
-
-#ifdef HAVE_INTERVAL_TREE_CACHED
-#define interval_tree_root rb_root_cached
-#define interval_tree_first rb_first_cached
-#define INTERVAL_TREE_ROOT RB_ROOT_CACHED
-#else
-#define interval_tree_root rb_root
-#define interval_tree_first rb_first
-#define INTERVAL_TREE_ROOT RB_ROOT
-#endif /* HAVE_INTERVAL_TREE_CACHED */
-
-#ifndef unsafe_memcpy
-#define unsafe_memcpy(to, from, size, reason) memcpy((to), (from), (size))
-#endif
-
#define FLEXIBLE_OBJECT \
"Struct contains a flexible member, the size of object is checked" \
"and can be safely copied in a single memcpy()"
return; \
} while (0)
-void cfs_debug_init(void);
-
static inline void cfs_tty_write_msg(const char *msg)
{
struct tty_struct *tty;
#define LIBCFS_CPT_ALLOC(ptr, cptab, cpt, size) \
LIBCFS_CPT_ALLOC_GFP(ptr, cptab, cpt, size, GFP_NOFS)
-void init_libcfs_vfree_atomic(void);
-void exit_libcfs_vfree_atomic(void);
-
#define LIBCFS_FREE(ptr, size) \
do { \
int s = (size); \
#define __ll_vmalloc(size, flags) __vmalloc(size, flags, PAGE_KERNEL)
#endif
+void init_libcfs_vfree_atomic(void);
+void exit_libcfs_vfree_atomic(void);
+
+/* atomic-context safe vfree */
+void libcfs_vfree_atomic(const void *addr);
+
#ifndef HAVE_KFREE_SENSITIVE
#define kfree_sensitive(x) kzfree(x)
#endif
#endif /* HAVE_KREF_READ */
void cfs_arch_init(void);
+void cfs_arch_exit(void);
#ifndef container_of_safe
/**
#define task_is_running(task) (task->state == TASK_RUNNING)
#endif
+/* interval tree */
+#ifdef HAVE_INTERVAL_TREE_CACHED
+#define interval_tree_root rb_root_cached
+#define interval_tree_first rb_first_cached
+#define INTERVAL_TREE_ROOT RB_ROOT_CACHED
+#else
+#define interval_tree_root rb_root
+#define interval_tree_first rb_first
+#define INTERVAL_TREE_ROOT RB_ROOT
+#endif /* HAVE_INTERVAL_TREE_CACHED */
+
+/* Linux v5.1-rc5 214d8ca6ee ("stacktrace: Provide common infrastructure")
+ * CONFIG_ARCH_STACKWALK indicates that save_stack_trace_tsk symbol is not
+ * exported. Use symbol_get() to find if save_stack_trace_tsk is available.
+ */
+#ifdef CONFIG_ARCH_STACKWALK
+int cfs_stack_trace_save_tsk(struct task_struct *task, unsigned long *store,
+ unsigned int size, unsigned int skipnr);
+#endif
+
#ifndef memset_startat
/** from linux 5.19 include/linux/string.h: */
#define memset_startat(obj, v, member) \
#define MAX_ST_ENTRIES 100
static DEFINE_SPINLOCK(st_lock);
-/* Linux v5.1-rc5 214d8ca6ee ("stacktrace: Provide common infrastructure")
- * CONFIG_ARCH_STACKWALK indicates that save_stack_trace_tsk symbol is not
- * exported. Use symbol_get() to find if save_stack_trace_tsk is available.
- */
-#ifdef CONFIG_ARCH_STACKWALK
-typedef unsigned int (stack_trace_save_tsk_t)(struct task_struct *task,
- unsigned long *store,
- unsigned int size,
- unsigned int skipnr);
-static stack_trace_save_tsk_t *task_dump_stack;
-#endif
-
-void __init cfs_debug_init(void)
-{
-#ifdef CONFIG_ARCH_STACKWALK
- task_dump_stack = (void *)
- cfs_kallsyms_lookup_name("stack_trace_save_tsk");
-
-#endif
-}
-
static void libcfs_call_trace(struct task_struct *tsk)
{
static unsigned long entries[MAX_ST_ENTRIES];
pr_info("Pid: %d, comm: %.20s %s %s\n", tsk->pid, tsk->comm,
init_utsname()->release, init_utsname()->version);
pr_info("Call Trace TBD:\n");
- if (task_dump_stack) {
- nr_entries = task_dump_stack(tsk, entries, MAX_ST_ENTRIES, 0);
- cfs_print_stack_trace(entries, nr_entries);
- }
+ nr_entries = cfs_stack_trace_save_tsk(tsk, entries, MAX_ST_ENTRIES, 0);
+ cfs_print_stack_trace(entries, nr_entries);
spin_unlock(&st_lock);
#else
struct stack_trace trace;
#include <linux/workqueue.h>
#include <libcfs/libcfs.h>
-#include <lustre_compat.h>
struct cfs_var_array {
unsigned int va_count; /* # of buffers */
return arr->va_count;
}
EXPORT_SYMBOL(cfs_percpt_number);
-
-
-/*
- * This is opencoding of vfree_atomic from Linux kernel added in 4.10 with
- * minimum changes needed to work on older kernels too.
- */
-
-#ifndef llist_for_each_safe
-#define llist_for_each_safe(pos, n, node) \
- for ((pos) = (node); (pos) && ((n) = (pos)->next, true); (pos) = (n))
-#endif
-
-struct vfree_deferred {
- struct llist_head list;
- struct work_struct wq;
-};
-static DEFINE_PER_CPU(struct vfree_deferred, vfree_deferred);
-
-static void free_work(struct work_struct *w)
-{
- struct vfree_deferred *p = container_of(w, struct vfree_deferred, wq);
- struct llist_node *t, *llnode;
-
- llist_for_each_safe(llnode, t, llist_del_all(&p->list))
- vfree((void *)llnode);
-}
-
-void libcfs_vfree_atomic(const void *addr)
-{
- struct vfree_deferred *p = raw_cpu_ptr(&vfree_deferred);
-
- if (!addr)
- return;
-
- if (llist_add((struct llist_node *)addr, &p->list))
- schedule_work(&p->wq);
-}
-EXPORT_SYMBOL(libcfs_vfree_atomic);
-
-void __init init_libcfs_vfree_atomic(void)
-{
- int i;
-
- for_each_possible_cpu(i) {
- struct vfree_deferred *p;
-
- p = &per_cpu(vfree_deferred, i);
- init_llist_head(&p->list);
- INIT_WORK(&p->wq, free_work);
- }
-}
-
-void __exit exit_libcfs_vfree_atomic(void)
-{
- flush_scheduled_work();
-}
#include <asm/kgdb.h>
#endif
+#include <lustre_compat.h>
#include <libcfs/linux/linux-time.h>
#include <libcfs/linux/linux-wait.h>
#include <libcfs/linux/linux-misc.h>
+#include <libcfs/linux/linux-mem.h>
#ifndef HAVE_XARRAY_SUPPORT
#include <libcfs/linux/xarray.h>
#endif
}
EXPORT_SYMBOL_GPL(cfs_apply_workqueue_attrs);
+/* Linux v5.1-rc5 214d8ca6ee ("stacktrace: Provide common infrastructure")
+ * CONFIG_ARCH_STACKWALK indicates that save_stack_trace_tsk symbol is not
+ * exported. Use symbol_get() to find if save_stack_trace_tsk is available.
+ */
+#ifdef CONFIG_ARCH_STACKWALK
+static unsigned int (*task_dump_stack_t)(struct task_struct *task,
+ unsigned long *store,
+ unsigned int size,
+ unsigned int skipnr);
+
+int cfs_stack_trace_save_tsk(struct task_struct *task, unsigned long *store,
+ unsigned int size, unsigned int skipnr)
+{
+ if (task_dump_stack_t)
+ return task_dump_stack_t(task, store, size, skipnr);
+ return 0;
+}
+#endif
+
#ifndef HAVE_XARRAY_SUPPORT
struct kmem_cache *xarray_cachep;
}
#endif
+/*
+ * This is opencoding of vfree_atomic from Linux kernel added in 4.10 with
+ * minimum changes needed to work on older kernels too.
+ */
+
+#ifndef llist_for_each_safe
+#define llist_for_each_safe(pos, n, node) \
+ for ((pos) = (node); (pos) && ((n) = (pos)->next, true); (pos) = (n))
+#endif
+
+struct vfree_deferred {
+ struct llist_head list;
+ struct work_struct wq;
+};
+static DEFINE_PER_CPU(struct vfree_deferred, vfree_deferred);
+
+static void free_work(struct work_struct *w)
+{
+ struct vfree_deferred *p = container_of(w, struct vfree_deferred, wq);
+ struct llist_node *t, *llnode;
+
+ llist_for_each_safe(llnode, t, llist_del_all(&p->list))
+ vfree((void *)llnode);
+}
+
+void libcfs_vfree_atomic(const void *addr)
+{
+ struct vfree_deferred *p = raw_cpu_ptr(&vfree_deferred);
+
+ if (!addr)
+ return;
+
+ if (llist_add((struct llist_node *)addr, &p->list))
+ schedule_work(&p->wq);
+}
+EXPORT_SYMBOL(libcfs_vfree_atomic);
+
+void __init init_libcfs_vfree_atomic(void)
+{
+ int i;
+
+ for_each_possible_cpu(i) {
+ struct vfree_deferred *p;
+
+ p = &per_cpu(vfree_deferred, i);
+ init_llist_head(&p->list);
+ INIT_WORK(&p->wq, free_work);
+ }
+}
+
void __init cfs_arch_init(void)
{
+ init_libcfs_vfree_atomic();
+
#ifndef HAVE_WAIT_VAR_EVENT
wait_bit_init();
#endif
+#ifdef CONFIG_ARCH_STACKWALK
+ task_dump_stack_t =
+ (void *)cfs_kallsyms_lookup_name("stack_trace_save_tsk");
+#endif
cfs_apply_workqueue_attrs_t =
(void *)cfs_kallsyms_lookup_name("apply_workqueue_attrs");
#ifndef HAVE_XARRAY_SUPPORT
#endif
}
+void __exit cfs_arch_exit(void)
+{
+ /* exit_libcfs_vfree_atomic */
+ flush_scheduled_work();
+}
+
int cfs_kernel_write(struct file *filp, const void *buf, size_t count,
loff_t *pos)
{
cfs_arch_init();
- init_libcfs_vfree_atomic();
-
rc = libcfs_debug_init(5 * 1024 * 1024);
if (rc < 0) {
pr_err("LustreError: libcfs_debug_init: rc = %d\n", rc);
return (rc);
}
- cfs_debug_init();
-
rc = cfs_cpu_init();
if (rc != 0)
goto cleanup_debug;
rc = libcfs_debug_cleanup();
if (rc)
pr_err("LustreError: libcfs_debug_cleanup: rc = %d\n", rc);
-
- exit_libcfs_vfree_atomic();
}
MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>");