From: Pablo Neira <pablo@eurodev.net>
To: "David S. Miller" <davem@redhat.com>,
netdev@oss.sgi.com, linux-net@vger.kernel.org
Subject: Re: [PATCH] Improve behaviour of Netlink Sockets
Date: Mon, 30 Aug 2004 02:37:45 +0200 [thread overview]
Message-ID: <413276D9.9080303@eurodev.net> (raw)
In-Reply-To: <20040827172736.543dbd54.davem@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 175 bytes --]
Hi Davem,
David S. Miller wrote:
>Is a 2.4.x version possible?
>
>
Attached the 2.4.x version. It just spawns one kernel thread called
netlink, is it ok?
regards,
Pablo
[-- Attachment #2: netlink-tqueue.patch --]
[-- Type: text/x-patch, Size: 4051 bytes --]
--- a/net/netlink/af_netlink.c 2004-08-28 05:35:35.000000000 +0200
+++ b/net/netlink/af_netlink.c 2004-08-29 16:00:46.000000000 +0200
@@ -42,6 +42,7 @@
#include <linux/notifier.h>
#include <net/sock.h>
#include <net/scm.h>
+#include <linux/tqueue.h>
#define Nprintk(a...)
@@ -63,6 +64,15 @@
void (*data_ready)(struct sock *sk, int bytes);
};
+struct netlink_work
+{
+ struct sock *sk;
+ int len;
+ struct tq_struct work;
+};
+
+static DECLARE_TASK_QUEUE(tq_netlink);
+static DECLARE_WAIT_QUEUE_HEAD(netlink_thread_wait);
static struct sock *nl_table[MAX_LINKS];
static DECLARE_WAIT_QUEUE_HEAD(nl_table_wait);
static unsigned nl_nonroot[MAX_LINKS];
@@ -81,6 +91,15 @@
static struct notifier_block *netlink_chain;
+void netlink_tq_handler(void *data)
+{
+ struct netlink_work *work = data;
+
+ work->sk->data_ready(work->sk, work->len);
+ sock_put(work->sk);
+ kfree(work);
+}
+
static void netlink_sock_destruct(struct sock *sk)
{
skb_queue_purge(&sk->receive_queue);
@@ -437,6 +456,8 @@
if (atomic_read(&sk->rmem_alloc) > sk->rcvbuf ||
test_bit(0, &sk->protinfo.af_netlink->state)) {
+ struct task_struct *client;
+
if (!timeo) {
if (ssk->protinfo.af_netlink->pid == 0)
netlink_overrun(sk);
@@ -445,6 +466,19 @@
return -EAGAIN;
}
+ if (!sk->protinfo.af_netlink->pid) {
+ /* Kernel is sending information to user space
+ * and socket buffer is full: Wake up user */
+
+ client = find_task_by_pid(sk->protinfo.af_netlink->pid);
+ if (!client) {
+ sock_put(sk);
+ kfree_skb(skb);
+ return -EAGAIN;
+ }
+ wake_up_process(client);
+ }
+
__set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&sk->protinfo.af_netlink->wait, &wait);
@@ -467,8 +501,26 @@
skb_orphan(skb);
skb_set_owner_r(skb, sk);
skb_queue_tail(&sk->receive_queue, skb);
- sk->data_ready(sk, len);
- sock_put(sk);
+
+ if (!sk->protinfo.af_netlink->pid) {
+ struct netlink_work *nlwork =
+ kmalloc(sizeof(struct netlink_work), GFP_KERNEL);
+
+ if (!nlwork) {
+ sock_put(sk);
+ return -EAGAIN;
+ }
+
+ INIT_TQUEUE(&nlwork->work, netlink_tq_handler, nlwork);
+ nlwork->sk = sk;
+ nlwork->len = len;
+ queue_task(&nlwork->work, &tq_netlink);
+ wake_up(&netlink_thread_wait);
+ } else {
+ sk->data_ready(sk, len);
+ sock_put(sk);
+ }
+
return len;
no_dst:
@@ -490,7 +542,22 @@
skb_orphan(skb);
skb_set_owner_r(skb, sk);
skb_queue_tail(&sk->receive_queue, skb);
- sk->data_ready(sk, skb->len);
+
+ if (!sk->protinfo.af_netlink->pid) {
+ struct netlink_work *nlwork =
+ kmalloc(sizeof(struct netlink_work), GFP_KERNEL);
+
+ if (!nlwork)
+ return -EAGAIN;
+
+ INIT_TQUEUE(&nlwork->work, netlink_tq_handler, nlwork);
+ nlwork->sk = sk;
+ nlwork->len = skb->len;
+ queue_task(&nlwork->work, &tq_netlink);
+ wake_up(&netlink_thread_wait);
+ } else
+ sk->data_ready(sk, skb->len);
+
return 0;
}
return -1;
@@ -534,11 +601,12 @@
netlink_overrun(sk);
/* Clone failed. Notify ALL listeners. */
failure = 1;
+ sock_put(sk);
} else if (netlink_broadcast_deliver(sk, skb2)) {
netlink_overrun(sk);
+ sock_put(sk);
} else
skb2 = NULL;
- sock_put(sk);
}
netlink_unlock_table();
@@ -868,6 +936,26 @@
netlink_unicast(in_skb->sk, skb, NETLINK_CB(in_skb).pid, MSG_DONTWAIT);
}
+int netlink_thread(void *unused)
+{
+ struct task_struct *tsk = current;
+ DECLARE_WAITQUEUE(wait, tsk);
+
+ daemonize();
+ strcpy(tsk->comm, "netlink");
+ sigfillset(&tsk->blocked);
+ mb();
+
+ for (;;) {
+ run_task_queue(&tq_netlink);
+
+ __set_current_state(TASK_INTERRUPTIBLE);
+ add_wait_queue(&netlink_thread_wait, &wait);
+ schedule();
+ __set_current_state(TASK_RUNNING);
+ remove_wait_queue(&netlink_thread_wait, &wait);
+ }
+}
#ifdef NL_EMULATE_DEV
@@ -1027,6 +1115,8 @@
#ifdef CONFIG_PROC_FS
create_proc_read_entry("net/netlink", 0, 0, netlink_read_proc, NULL);
#endif
+ kernel_thread(netlink_thread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGNAL);
+
return 0;
}
next parent reply other threads:[~2004-08-30 0:37 UTC|newest]
Thread overview: 96+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <412DF807.2040703@eurodev.net>
[not found] ` <20040826141407.38b56729.davem@redhat.com>
[not found] ` <412EB40A.6010100@eurodev.net>
[not found] ` <20040826214710.5e322f1a.davem@redhat.com>
[not found] ` <412F1269.8090303@eurodev.net>
[not found] ` <20040827172736.543dbd54.davem@redhat.com>
2004-08-30 0:37 ` Pablo Neira [this message]
2004-08-31 0:20 ` [PATCH] Improve behaviour of Netlink Sockets David S. Miller
2004-08-31 16:37 ` Pablo Neira
2004-08-31 20:16 ` David S. Miller
2004-09-18 10:25 ` Herbert Xu
2004-09-19 4:36 ` Pablo Neira
2004-09-19 5:18 ` Pablo Neira
2004-09-19 7:58 ` Herbert Xu
2004-09-19 12:02 ` Herbert Xu
2004-09-19 12:07 ` Herbert Xu
2004-09-19 20:50 ` Pablo Neira
2004-09-19 21:53 ` Herbert Xu
2004-09-19 22:49 ` Pablo Neira
2004-09-19 23:44 ` Herbert Xu
2004-09-20 0:31 ` Pablo Neira
2004-09-20 1:00 ` Herbert Xu
2004-09-19 20:50 ` Pablo Neira
2004-09-19 21:59 ` Herbert Xu
2004-09-19 22:39 ` jamal
2004-09-19 22:55 ` Pablo Neira
2004-09-19 23:04 ` jamal
2004-09-19 23:10 ` Herbert Xu
2004-09-19 23:17 ` Herbert Xu
2004-09-20 2:39 ` jamal
2004-09-20 2:58 ` Herbert Xu
2004-09-20 12:34 ` jamal
2004-09-20 18:14 ` Pablo Neira
2004-09-20 21:59 ` Herbert Xu
2004-09-21 11:47 ` jamal
2004-09-21 12:09 ` Herbert Xu
2004-09-22 0:05 ` Herbert Xu
2004-09-22 0:24 ` Pablo Neira
2004-09-22 2:48 ` Pablo Neira
2004-09-22 2:50 ` David S. Miller
2004-09-22 2:53 ` jamal
2004-09-22 3:46 ` Herbert Xu
2004-09-22 11:35 ` jamal
2004-09-23 12:05 ` Herbert Xu
2004-09-24 2:56 ` jamal
2004-09-24 3:20 ` Herbert Xu
2004-09-27 12:41 ` jamal
2004-09-22 4:52 ` Herbert Xu
2004-09-22 12:08 ` jamal
2004-09-22 17:52 ` David S. Miller
2004-09-23 15:40 ` Pablo Neira
2004-09-23 19:16 ` David S. Miller
2004-09-24 3:28 ` Herbert Xu
2004-09-24 5:39 ` David S. Miller
2004-09-24 6:26 ` Herbert Xu
2004-09-24 17:58 ` David S. Miller
2004-09-24 22:06 ` Herbert Xu
2004-09-24 22:28 ` Herbert Xu
2004-09-27 12:59 ` jamal
2004-09-27 12:53 ` jamal
2004-09-23 12:07 ` Herbert Xu
2004-09-24 1:19 ` Pablo Neira
2004-09-24 3:04 ` jamal
2004-09-24 3:24 ` Herbert Xu
2004-09-27 12:46 ` jamal
2004-09-27 21:36 ` Herbert Xu
2004-09-28 2:43 ` jamal
2004-09-28 2:46 ` Herbert Xu
2004-09-28 3:06 ` jamal
2004-09-28 3:23 ` Herbert Xu
2004-09-28 3:45 ` jamal
2004-09-28 3:59 ` Herbert Xu
2004-09-28 10:36 ` jamal
2004-09-28 11:11 ` Herbert Xu
2004-09-28 12:16 ` Herbert Xu
2004-09-28 12:39 ` On DaveMs congestion control algorithm WAS(Re: " jamal
2004-09-28 18:24 ` David S. Miller
2004-09-29 2:23 ` jamal
2004-09-28 12:32 ` jamal
2004-09-29 0:13 ` Herbert Xu
2004-09-29 2:52 ` jamal
2004-09-29 3:27 ` Herbert Xu
2004-09-29 4:02 ` David S. Miller
2004-09-29 10:50 ` jamal
2004-09-29 11:42 ` Herbert Xu
2004-09-29 13:55 ` jamal
2004-09-28 21:07 ` Pablo Neira
2004-09-28 23:19 ` Herbert Xu
2004-09-28 23:20 ` David S. Miller
2004-09-29 2:28 ` jamal
2004-09-29 2:30 ` Herbert Xu
2004-09-29 2:59 ` jamal
2004-09-22 2:57 ` jamal
2004-09-22 3:39 ` Herbert Xu
2004-09-19 20:47 ` Pablo Neira
2004-09-19 21:20 ` Herbert Xu
2004-09-19 22:14 ` Pablo Neira
2004-09-19 23:31 ` Herbert Xu
[not found] ` <E1C90Da-0001V7-00@gondolin.me.apana.org.au>
2004-09-19 12:00 ` Herbert Xu
2004-09-29 9:53 James Chapman
2004-09-29 9:59 ` Herbert Xu
-- strict thread matches above, loose matches on Subject: below --
2004-09-30 9:50 James Chapman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=413276D9.9080303@eurodev.net \
--to=pablo@eurodev.net \
--cc=davem@redhat.com \
--cc=linux-net@vger.kernel.org \
--cc=netdev@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).