summaryrefslogtreecommitdiff
path: root/debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch')
-rw-r--r--debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch116
1 files changed, 116 insertions, 0 deletions
diff --git a/debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch b/debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch
new file mode 100644
index 0000000..a943390
--- /dev/null
+++ b/debian/patches/upstreamme0005-device-use-general-lock-for-port-lists.patch
@@ -0,0 +1,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
+