X-Git-Url: http://git.onelab.eu/?p=linux-2.6.git;a=blobdiff_plain;f=linux-2.6-525-sknid-elevator.patch;h=87dbfa5e62a98af8fa5ae60d4d8ce2fcc94d5900;hp=e28a3c9f957c18ccfc41092369ea8b71bb45c724;hb=HEAD;hpb=425221f28c27122daff4d0933ef878ff26ff6f15 diff --git a/linux-2.6-525-sknid-elevator.patch b/linux-2.6-525-sknid-elevator.patch index e28a3c9f9..87dbfa5e6 100644 --- a/linux-2.6-525-sknid-elevator.patch +++ b/linux-2.6-525-sknid-elevator.patch @@ -1,8 +1,19 @@ +From f5cda6cb8da57f20cb58e5d8e8bf41b9e155c06c Mon Sep 17 00:00:00 2001 +From: S.Çağlar Onur +Date: Tue, 7 Dec 2010 11:07:40 -0500 +Subject: [PATCH] linux-2.6-525-sknid-elevator.patch + +--- + include/linux/netdevice.h | 1 + + net/core/dev.c | 30 +++++++++++++++++++ + net/packet/af_packet.c | 71 +++++++++++++++++++++++++++++++++++++++++++- + 3 files changed, 100 insertions(+), 2 deletions(-) + diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h -index 4267c8b..3f36a91 100644 +index 3af28fb..8730e89 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h -@@ -1057,6 +1057,7 @@ struct napi_gro_cb { +@@ -1259,6 +1259,7 @@ struct napi_gro_cb { struct packet_type { __be16 type; /* This is really htons(ether_type). */ struct net_device *dev; /* NULL is wildcarded here */ @@ -11,7 +22,7 @@ index 4267c8b..3f36a91 100644 struct net_device *, struct packet_type *, diff --git a/net/core/dev.c b/net/core/dev.c -index 8b6b941..651a1c3 100644 +index 1226d0d..e8d66b6 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -99,6 +99,8 @@ @@ -23,7 +34,7 @@ index 8b6b941..651a1c3 100644 #include #include #include -@@ -2275,6 +2277,10 @@ void netif_nit_deliver(struct sk_buff *skb) +@@ -2620,6 +2622,10 @@ void netif_nit_deliver(struct sk_buff *skb) rcu_read_unlock(); } @@ -31,12 +42,12 @@ index 8b6b941..651a1c3 100644 + * sequentially on the same CPU. -Sapan */ +DEFINE_PER_CPU(int, sknid_elevator) = 0; + - /** - * netif_receive_skb - process receive buffer from network - * @skb: buffer to process -@@ -2296,8 +2302,11 @@ int netif_receive_skb(struct sk_buff *skb) - struct net_device *orig_dev; + int __netif_receive_skb(struct sk_buff *skb) + { + struct packet_type *ptype, *pt_prev; +@@ -2627,8 +2633,11 @@ int __netif_receive_skb(struct sk_buff *skb) struct net_device *null_or_orig; + struct net_device *null_or_bond; int ret = NET_RX_DROP; + int *cur_elevator = &__get_cpu_var(sknid_elevator); __be16 type; @@ -46,35 +57,35 @@ index 8b6b941..651a1c3 100644 if (!skb->tstamp.tv64) net_timestamp(skb); -@@ -2373,7 +2382,27 @@ ncls: +@@ -2729,7 +2738,27 @@ ncls: } if (pt_prev) { + /* At this point, cur_elevator may be -2 or a positive value, in -+ * case a previous protocol handler marked it */ -+ if (*cur_elevator) { -+ atomic_inc(&skb->users); -+ } -+ ++ * case a previous protocol handler marked it */ ++ if (*cur_elevator) { ++ atomic_inc(&skb->users); ++ } ++ ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); + -+ if ((*cur_elevator)>0) { -+ skb->skb_tag = *cur_elevator; -+ list_for_each_entry_rcu(ptype, &ptype_all, list) { -+ if ((!ptype->dev || ptype->dev == skb->dev) && (ptype->sknid_elevator)) { -+ ret = deliver_skb(skb, ptype, orig_dev); -+ } -+ } -+ } -+ -+ if (*cur_elevator) { -+ /* We have a packet */ -+ kfree_skb(skb); -+ } ++ if ((*cur_elevator)>0) { ++ skb->skb_tag = *cur_elevator; ++ list_for_each_entry_rcu(ptype, &ptype_all, list) { ++ if ((!ptype->dev || ptype->dev == skb->dev) && (ptype->sknid_elevator)) { ++ ret = deliver_skb(skb, ptype, orig_dev); ++ } ++ } ++ } ++ ++ if (*cur_elevator) { ++ /* We have a packet */ ++ kfree_skb(skb); ++ } } else { kfree_skb(skb); /* Jamal, now you will not able to escape explaining -@@ -4127,6 +4156,7 @@ unsigned dev_get_flags(const struct net_device *dev) +@@ -4576,6 +4605,7 @@ unsigned dev_get_flags(const struct net_device *dev) return flags; } EXPORT_SYMBOL(dev_get_flags); @@ -83,7 +94,7 @@ index 8b6b941..651a1c3 100644 /** * dev_change_flags - change device settings diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c -index 1bd109e..5c2e9ad 100644 +index d67f5e4..fcaa094 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -78,6 +78,7 @@ @@ -92,13 +103,13 @@ index 1bd109e..5c2e9ad 100644 #include +#include #include - - #ifdef CONFIG_INET -@@ -337,12 +338,54 @@ static const struct proto_ops packet_ops; + #include + #include +@@ -340,12 +341,54 @@ static const struct proto_ops packet_ops; static const struct proto_ops packet_ops_spkt; -+extern DEFINE_PER_CPU(int, sknid_elevator); ++DECLARE_PER_CPU(int, sknid_elevator); + +static inline unsigned int slice_check_and_elevate(struct sk_buff *skb, struct sock *sk) { + /* This mechanism is quite involved, and caused us a lot of pain @@ -145,12 +156,12 @@ index 1bd109e..5c2e9ad 100644 struct sock *sk; struct sockaddr_pkt *spkt; - -+ int tag = skb->skb_tag; ++ + /* * When we registered the protocol we saved the socket in the data * field for just this event. -@@ -361,6 +404,16 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, +@@ -364,6 +407,16 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev, * so that this procedure is noop. */ @@ -167,7 +178,7 @@ index 1bd109e..5c2e9ad 100644 if (skb->pkt_type == PACKET_LOOPBACK) goto out; -@@ -419,6 +472,9 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock, +@@ -422,6 +475,9 @@ static int packet_sendmsg_spkt(struct kiocb *iocb, struct socket *sock, __be16 proto = 0; int err; @@ -177,7 +188,7 @@ index 1bd109e..5c2e9ad 100644 /* * Get and verify the address. */ -@@ -509,11 +565,16 @@ out_unlock: +@@ -512,11 +568,16 @@ out_unlock: return err; } @@ -194,7 +205,7 @@ index 1bd109e..5c2e9ad 100644 rcu_read_lock_bh(); filter = rcu_dereference(sk->sk_filter); if (filter != NULL) -@@ -1063,6 +1124,9 @@ static int packet_snd(struct socket *sock, +@@ -1088,6 +1149,9 @@ static int packet_snd(struct socket *sock, unsigned char *addr; int ifindex, err, reserve = 0; @@ -204,7 +215,7 @@ index 1bd109e..5c2e9ad 100644 /* * Get and verify the address. */ -@@ -1248,6 +1312,7 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 protoc +@@ -1273,6 +1337,7 @@ static int packet_do_bind(struct sock *sk, struct net_device *dev, __be16 protoc po->num = protocol; po->prot_hook.type = protocol; @@ -212,7 +223,7 @@ index 1bd109e..5c2e9ad 100644 po->prot_hook.dev = dev; po->ifindex = dev ? dev->ifindex : 0; -@@ -1348,8 +1413,9 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, +@@ -1373,8 +1438,9 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, __be16 proto = (__force __be16)protocol; /* weird, but documented */ int err; @@ -223,7 +234,7 @@ index 1bd109e..5c2e9ad 100644 if (sock->type != SOCK_DGRAM && sock->type != SOCK_RAW && sock->type != SOCK_PACKET) return -ESOCKTNOSUPPORT; -@@ -1381,6 +1447,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, +@@ -1406,6 +1472,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol, spin_lock_init(&po->bind_lock); mutex_init(&po->pg_vec_lock); po->prot_hook.func = packet_rcv;