summaryrefslogtreecommitdiff
path: root/debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch
blob: a9433903971582454d6f7a43de73cd2073f576fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
From 148ca384324574ffdbd9350cd95d19c5ebf36453 Mon Sep 17 00:00:00 2001
From: Justus Winter <4winter@informatik.uni-hamburg.de>
Date: Sat, 25 Jul 2015 01:55:22 +0200
Subject: [PATCH gnumach 05/10] device: use general lock for port lists

* device/if_hdr.h (struct ifnet): Turn the port list locks into
general locks.
(port_list_{lock_init,lock,unlock): New macros.
* device/net_io.c (net_filter, net_set_filter): Use new macros.
* device/subrs.c (if_init_queues): Likewise.
---
 device/if_hdr.h | 12 +++++++-----
 device/net_io.c | 20 ++++++++++----------
 device/subrs.c  |  4 ++--
 3 files changed, 19 insertions(+), 17 deletions(-)

diff --git a/device/if_hdr.h b/device/if_hdr.h
index e53983b..58a670c 100644
--- a/device/if_hdr.h
+++ b/device/if_hdr.h
@@ -92,11 +92,13 @@ struct ifnet {
 	struct ifqueue if_snd;		/* output queue */
 	queue_head_t if_rcv_port_list;	/* input filter list */
 	queue_head_t if_snd_port_list;	/* output filter list */
-	decl_simple_lock_data(,
-		if_rcv_port_list_lock)	/* lock for input filter list */
-	decl_simple_lock_data(,
-		if_snd_port_list_lock)	/* lock for output filter list */
-/* statistics */
+	struct lock if_rcv_port_list_lock; /* lock for input filter list */
+	struct lock if_snd_port_list_lock; /* lock for output filter list */
+#define port_list_lock_init(l)	lock_init(l, FALSE)
+#define port_list_lock(l)	lock_write(l)
+#define port_list_unlock(l)	lock_write_done(l)
+
+	/* statistics */
 	int	if_ipackets;		/* packets received */
 	int	if_ierrors;		/* input errors */
 	int	if_opackets;		/* packets sent */
diff --git a/device/net_io.c b/device/net_io.c
index 47ef2ea..12a1e9c 100644
--- a/device/net_io.c
+++ b/device/net_io.c
@@ -722,8 +722,8 @@ net_filter(kmsg, send_list)
 	 * Both locks are hold in case a filter is removed from both
 	 * queues.
 	 */
-	simple_lock(&ifp->if_rcv_port_list_lock);
-	simple_lock(&ifp->if_snd_port_list_lock);
+	port_list_lock(&ifp->if_rcv_port_list_lock);
+	port_list_lock(&ifp->if_snd_port_list_lock);
 	FILTER_ITERATE(if_port_list, infp, nextfp,
 		       net_kmsg(kmsg)->sent ? &infp->output : &infp->input)
 	{
@@ -853,8 +853,8 @@ net_filter(kmsg, send_list)
 	    }
 	}
 	FILTER_ITERATE_END
-	simple_unlock(&ifp->if_snd_port_list_lock);
-	simple_unlock(&ifp->if_rcv_port_list_lock);
+	port_list_unlock(&ifp->if_snd_port_list_lock);
+	port_list_unlock(&ifp->if_rcv_port_list_lock);
 
 	/*
 	 * Deallocate dead filters.
@@ -1255,8 +1255,8 @@ net_set_filter(
     in = (filter[0] & NETF_IN) != 0;
     out = (filter[0] & NETF_OUT) != 0;
 
-    simple_lock(&ifp->if_rcv_port_list_lock);
-    simple_lock(&ifp->if_snd_port_list_lock);
+    port_list_lock(&ifp->if_rcv_port_list_lock);
+    port_list_lock(&ifp->if_snd_port_list_lock);
 
     if (in)
 	check_filter_list(&ifp->if_rcv_port_list);
@@ -1272,8 +1272,8 @@ net_set_filter(
 	}
 	if (i == N_NET_HASH) {
 	    simple_unlock(&net_hash_header_lock);
-	    simple_unlock(&ifp->if_snd_port_list_lock);
-	    simple_unlock(&ifp->if_rcv_port_list_lock);
+	    port_list_unlock(&ifp->if_snd_port_list_lock);
+	    port_list_unlock(&ifp->if_rcv_port_list_lock);
 
             ipc_port_release_send(rcv_port);
 	    if (match != 0)
@@ -1352,8 +1352,8 @@ net_set_filter(
 	hash_entp->rcv_qlimit = net_add_q_info(rcv_port);
     }
     
-    simple_unlock(&ifp->if_snd_port_list_lock);
-    simple_unlock(&ifp->if_rcv_port_list_lock);
+    port_list_unlock(&ifp->if_snd_port_list_lock);
+    port_list_unlock(&ifp->if_rcv_port_list_lock);
 
 clean_and_return:
     /* No locks are held at this point. */
diff --git a/device/subrs.c b/device/subrs.c
index a10b72d..cfaaecd 100644
--- a/device/subrs.c
+++ b/device/subrs.c
@@ -80,8 +80,8 @@ void if_init_queues(struct ifnet *ifp)
 	IFQ_INIT(&ifp->if_snd);
 	queue_init(&ifp->if_rcv_port_list);
 	queue_init(&ifp->if_snd_port_list);
-	simple_lock_init(&ifp->if_rcv_port_list_lock);
-	simple_lock_init(&ifp->if_snd_port_list_lock);
+	port_list_lock_init(&ifp->if_rcv_port_list_lock);
+	port_list_lock_init(&ifp->if_snd_port_list_lock);
 }
 
 
-- 
2.1.4