From 04ba582cf57deacb07884b2d26ef60a591087dd3 Mon Sep 17 00:00:00 2001 From: Frederic Robra Date: Tue, 9 Jul 2019 12:12:55 +0200 Subject: added worker for keepalive and discovery --- src/kernel/core.c | 7 +++++++ src/kernel/dnbd3.h | 4 +++- src/kernel/net.c | 16 ++++++++-------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/kernel/core.c b/src/kernel/core.c index 48f809b..1b0aa46 100644 --- a/src/kernel/core.c +++ b/src/kernel/core.c @@ -54,6 +54,8 @@ #define DNBD3_CMD_REQUEUED 1 + +struct workqueue_struct *dnbd3_wq; DEFINE_IDR(dnbd3_index_idr); DEFINE_MUTEX(dnbd3_index_mutex); @@ -426,6 +428,8 @@ static int __init dnbd3_init(void) int i; printk(KERN_DEBUG "dnbd3: starting kernel module\n"); + dnbd3_wq = alloc_workqueue("kdnbd3", WQ_MEM_RECLAIM | WQ_FREEZABLE, 1); + if (max_devs < 0) { printk(KERN_ERR "dnbd3: max_devs must be >= 0\n"); return -EINVAL; @@ -483,6 +487,7 @@ static void dnbd3_dev_remove(struct dnbd3_device *dnbd3) disk->private_data = NULL; put_disk(disk); } + mutex_destroy(&dnbd3->device_lock); } static void dnbd3_put(struct dnbd3_device *dnbd3) @@ -516,6 +521,8 @@ static void __exit dnbd3_exit(void) kfree(device); + destroy_workqueue(dnbd3_wq); + printk(KERN_INFO "dnbd3: stopped kernel module\n"); } diff --git a/src/kernel/dnbd3.h b/src/kernel/dnbd3.h index 57f26f6..0e39dfb 100644 --- a/src/kernel/dnbd3.h +++ b/src/kernel/dnbd3.h @@ -33,6 +33,9 @@ #define NUMBER_CONNECTIONS 4 + +extern struct workqueue_struct *dnbd3_wq; + typedef struct dnbd3_server { dnbd3_host_t host; uint64_t rtts[4]; // Last four round trip time measurements in microsecond @@ -90,7 +93,6 @@ typedef struct dnbd3_device { struct work_struct discovery; // if in irq and need to send request struct timer_list discovery_timer; - // process // struct task_struct * thread_send; // struct task_struct * thread_receive; diff --git a/src/kernel/net.c b/src/kernel/net.c index f44925f..921f0d3 100644 --- a/src/kernel/net.c +++ b/src/kernel/net.c @@ -31,8 +31,8 @@ #define dnbd3_req_op(req) req_op(req) #define dnbd3_sock_create(af,type,proto,sock) sock_create_kern(&init_net, (af) == HOST_IP4 ? AF_INET : AF_INET6, type, proto, sock) -#define KEEPALIVE_TIMER (TIMER_INTERVAL_KEEPALIVE_PACKET * (jiffies + HZ)) -#define DISCOVERY_TIMER (TIMER_INTERVAL_PROBE_NORMAL * (jiffies + HZ)) +#define KEEPALIVE_TIMER (jiffies + (HZ * TIMER_INTERVAL_KEEPALIVE_PACKET)) +#define DISCOVERY_TIMER (jiffies + (HZ * TIMER_INTERVAL_PROBE_NORMAL)) #define init_msghdr(h) do { \ h.msg_name = NULL; \ @@ -43,6 +43,7 @@ } while (0) + static void printHost(struct dnbd3_host_t *host, char *msg) { if (host->type == HOST_IP4) { @@ -239,8 +240,8 @@ error: void dnbd3_keepalive(struct timer_list *arg) { struct dnbd3_sock *sock = container_of(arg, struct dnbd3_sock, keepalive_timer); - printk(KERN_DEBUG "dnbd3: schedule keepalive\n"); // schedule_work(&sock->keepalive); + queue_work(dnbd3_wq, &sock->keepalive); sock->keepalive_timer.expires = KEEPALIVE_TIMER; add_timer(&sock->keepalive_timer); } @@ -249,6 +250,7 @@ static void keepalive(struct work_struct *work) { struct dnbd3_sock *sock = container_of(work, struct dnbd3_sock, keepalive); struct request *req; + printk(KERN_DEBUG "dnbd3: starting keepalive worker\n"); mutex_lock(&sock->lock); req = kmalloc(sizeof(struct request), GFP_ATOMIC ); // send keepalive @@ -266,8 +268,7 @@ static void keepalive(struct work_struct *work) void dnbd3_discovery(struct timer_list *arg) { struct dnbd3_device *dev = container_of(arg, struct dnbd3_device, discovery_timer); - printk(KERN_DEBUG "dnbd3: schedule discovery\n"); -// schedule_work(&dev->discovery); + queue_work(dnbd3_wq, &dev->discovery); dev->discovery_timer.expires = DISCOVERY_TIMER; add_timer(&dev->discovery_timer); } @@ -277,12 +278,13 @@ static void discovery(struct work_struct *work) struct dnbd3_device *dev = container_of(work, struct dnbd3_device, discovery); dnbd3_sock *sock = &dev->socks[0]; // we use the first sock for discovery struct request *req; + printk(KERN_DEBUG "dnbd3: starting discovery worker\n"); mutex_lock(&sock->lock); req = kmalloc(sizeof(struct request), GFP_ATOMIC ); // send keepalive if (req) { dnbd3_cmd_to_priv(req, CMD_GET_SERVERS); - dnbd3_send_request(NULL, sock, req); // we do not need the device for keepalive + dnbd3_send_request(dev, sock, req); // we do not need the device for keepalive kfree(req); } else { printk(KERN_WARNING "dnbd3: could not create get servers request\n"); @@ -468,7 +470,6 @@ static int dnbd3_socket_disconnect(dnbd3_device *dev, dnbd3_sock *sock) // clear heartbeat timer del_timer_sync(&sock->keepalive_timer); -// destroy_workqueue(&sock->keepalive); if (sock->sock) { kernel_sock_shutdown(sock->sock, SHUT_RDWR); @@ -490,7 +491,6 @@ int dnbd3_net_disconnect(struct dnbd3_device *dev) int i; int result; del_timer_sync(&dev->discovery_timer); -// destroy_workqueue(&dev->discovery); for (i = 0; i < NUMBER_CONNECTIONS; i++) { if (dev->socks[i].sock) { if (dnbd3_socket_disconnect(dev, &dev->socks[i])) { -- cgit v1.2.3-55-g7522