diff options
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.patch | 116 |
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 + |