diff options
author | ngie <ngie@FreeBSD.org> | 2015-12-29 19:56:26 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2015-12-29 19:56:26 +0000 |
commit | 48b72481dba08c5185c1dd6a70b82b326be43d6b (patch) | |
tree | bfa4f047c73b138c59732a37297737fa1ffd3e91 /sys/compat/linuxkpi/common/src | |
parent | f8c5cd12c37a92500da3f42f1d25bae9cc70e30a (diff) | |
parent | c0ae58548ada98f553239a091b8764ea9e1b474b (diff) | |
download | FreeBSD-src-48b72481dba08c5185c1dd6a70b82b326be43d6b.zip FreeBSD-src-48b72481dba08c5185c1dd6a70b82b326be43d6b.tar.gz |
MFhead @ r292618
Diffstat (limited to 'sys/compat/linuxkpi/common/src')
-rw-r--r-- | sys/compat/linuxkpi/common/src/linux_compat.c | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c index cc0479b..91ec693 100644 --- a/sys/compat/linuxkpi/common/src/linux_compat.c +++ b/sys/compat/linuxkpi/common/src/linux_compat.c @@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$"); #include <linux/vmalloc.h> #include <linux/netdevice.h> #include <linux/timer.h> +#include <linux/workqueue.h> #include <vm/vm_pager.h> @@ -93,7 +94,50 @@ panic_cmp(struct rb_node *one, struct rb_node *two) } RB_GENERATE(linux_root, rb_node, __entry, panic_cmp); - + +int +kobject_set_name_vargs(struct kobject *kobj, const char *fmt, va_list args) +{ + va_list tmp_va; + int len; + char *old; + char *name; + char dummy; + + old = kobj->name; + + if (old && fmt == NULL) + return (0); + + /* compute length of string */ + va_copy(tmp_va, args); + len = vsnprintf(&dummy, 0, fmt, tmp_va); + va_end(tmp_va); + + /* account for zero termination */ + len++; + + /* check for error */ + if (len < 1) + return (-EINVAL); + + /* allocate memory for string */ + name = kzalloc(len, GFP_KERNEL); + if (name == NULL) + return (-ENOMEM); + vsnprintf(name, len, fmt, args); + kobj->name = name; + + /* free old string */ + kfree(old); + + /* filter new string */ + for (; *name != '\0'; name++) + if (*name == '/') + *name = '!'; + return (0); +} + int kobject_set_name(struct kobject *kobj, const char *fmt, ...) { @@ -913,6 +957,50 @@ linux_completion_done(struct completion *c) return (isdone); } +void +linux_delayed_work_fn(void *arg) +{ + struct delayed_work *work; + + work = arg; + taskqueue_enqueue(work->work.taskqueue, &work->work.work_task); +} + +void +linux_work_fn(void *context, int pending) +{ + struct work_struct *work; + + work = context; + work->fn(work); +} + +void +linux_flush_fn(void *context, int pending) +{ +} + +struct workqueue_struct * +linux_create_workqueue_common(const char *name, int cpus) +{ + struct workqueue_struct *wq; + + wq = kmalloc(sizeof(*wq), M_WAITOK); + wq->taskqueue = taskqueue_create(name, M_WAITOK, + taskqueue_thread_enqueue, &wq->taskqueue); + atomic_set(&wq->draining, 0); + taskqueue_start_threads(&wq->taskqueue, cpus, PWAIT, "%s", name); + + return (wq); +} + +void +destroy_workqueue(struct workqueue_struct *wq) +{ + taskqueue_free(wq->taskqueue); + kfree(wq); +} + static void linux_compat_init(void *arg) { |