[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Remus: make ebt_imq and sch_queue compatible with pvops
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1271317328 -3600 # Node ID 373daaeb636e8e237c67995718201619d0c0cbc9 # Parent ecdc146344250119b0e81b7aff625f8d2d09a672 Remus: make ebt_imq and sch_queue compatible with pvops Signed-off-by: Brendan Cully <brendan@xxxxxxxxx> --- tools/remus/kmod/Makefile | 3 + tools/remus/kmod/ebt_imq.c | 69 +++++++++++++++++++++++++++++++++++++------ tools/remus/kmod/ebt_imq.h | 6 +++ tools/remus/kmod/sch_queue.c | 48 ++++++++++++++++++++++++----- 4 files changed, 108 insertions(+), 18 deletions(-) diff -r ecdc14634425 -r 373daaeb636e tools/remus/kmod/Makefile --- a/tools/remus/kmod/Makefile Wed Apr 14 13:35:05 2010 +0100 +++ b/tools/remus/kmod/Makefile Thu Apr 15 08:42:08 2010 +0100 @@ -8,6 +8,9 @@ endif endif ifeq ($(KERNELS),linux-2.6-xen0) LINUX_VER=2.6.18-xen0 +endif +ifeq ($(KERNELS),linux-2.6-pvops) +LINUX_VER=2.6-pvops endif KERNELDIR ?= $(XEN_ROOT)/build-linux-$(LINUX_VER)_$(XEN_TARGET_ARCH) diff -r ecdc14634425 -r 373daaeb636e tools/remus/kmod/ebt_imq.c --- a/tools/remus/kmod/ebt_imq.c Wed Apr 14 13:35:05 2010 +0100 +++ b/tools/remus/kmod/ebt_imq.c Thu Apr 15 08:42:08 2010 +0100 @@ -1,8 +1,18 @@ +#include <linux/version.h> +#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18) +# define OLDKERNEL +#endif + #include <linux/module.h> #include <linux/skbuff.h> +#ifndef OLDKERNEL +# include <linux/netfilter/x_tables.h> +#endif #include <linux/netfilter_bridge/ebtables.h> #include <linux/netdevice.h> #include "ebt_imq.h" + +#ifdef OLDKERNEL static int ebt_target_imq(struct sk_buff **pskb, unsigned int hooknr, const struct net_device *in, const struct net_device *out, @@ -21,25 +31,66 @@ static int ebt_target_imq_check(const ch return 0; } -static struct ebt_target imq_target = +static struct ebt_target ebt_imq_target = { - .name = "imq", - .target = ebt_target_imq, + .name = EBT_IMQ_TARGET, + .target = ebt_target_imq, .check = ebt_target_imq_check, .me = THIS_MODULE, }; -static int __init init(void) +static int __init ebt_imq_init(void) { - return ebt_register_target(&imq_target); + return ebt_register_target(&ebt_imq_target); } -static void __exit fini(void) +static void __exit ebt_imq_fini(void) { - ebt_unregister_target(&imq_target); + ebt_unregister_target(&ebt_imq_target); } +#else /* OLDKERNEL */ -module_init(init); -module_exit(fini); +static unsigned int +ebt_imq_tg(struct sk_buff *skb, const struct xt_target_param *par) +{ + const struct ebt_imq_info *info = par->targinfo; + + if (!skb_make_writable(skb, 0)) + return EBT_DROP; + + skb->imq_flags = info->todev | IMQ_F_ENQUEUE; + + return EBT_CONTINUE; +} + +static bool ebt_imq_tg_check(const struct xt_tgchk_param *par) +{ + return true; +} + +static struct xt_target ebt_imq_target __read_mostly = { + .name = EBT_IMQ_TARGET, + .revision = 0, + .family = NFPROTO_BRIDGE, + .target = ebt_imq_tg, + .checkentry = ebt_imq_tg_check, + .targetsize = XT_ALIGN(sizeof(struct ebt_imq_info)), + .me = THIS_MODULE, +}; + +static int __init ebt_imq_init(void) +{ + return xt_register_target(&ebt_imq_target); +} + +static void __init ebt_imq_fini(void) +{ + xt_unregister_target(&ebt_imq_target); +} + +#endif /* OLDKERNEL */ + +module_init(ebt_imq_init); +module_exit(ebt_imq_fini); MODULE_LICENSE("GPL"); diff -r ecdc14634425 -r 373daaeb636e tools/remus/kmod/ebt_imq.h --- a/tools/remus/kmod/ebt_imq.h Wed Apr 14 13:35:05 2010 +0100 +++ b/tools/remus/kmod/ebt_imq.h Thu Apr 15 08:42:08 2010 +0100 @@ -1,10 +1,14 @@ #ifndef __LINUX_BRIDGE_EBT_IMQ_H #define __LINUX_BRIDGE_EBT_IMQ_H -#define IMQ_F_ENQUEUE 0x80 +#ifdef OLDKERNEL +# define IMQ_F_ENQUEUE 0x80 +#endif struct ebt_imq_info { unsigned int todev; }; +#define EBT_IMQ_TARGET "imq" + #endif diff -r ecdc14634425 -r 373daaeb636e tools/remus/kmod/sch_queue.c --- a/tools/remus/kmod/sch_queue.c Wed Apr 14 13:35:05 2010 +0100 +++ b/tools/remus/kmod/sch_queue.c Thu Apr 15 08:42:08 2010 +0100 @@ -16,7 +16,14 @@ * So it supports two operations, barrier and release. */ -#include <linux/config.h> +#include <linux/version.h> +#if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,18) +# define OLDKERNEL +#endif + +#ifdef OLDKERNEL +# include <linux/config.h> +#endif #include <linux/module.h> #include <linux/types.h> #include <linux/kernel.h> @@ -25,6 +32,17 @@ #include <linux/skbuff.h> #include <net/pkt_sched.h> +#ifdef OLDKERNEL +# define compatnlattr rtattr +# define compatnllen RTA_PAYLOAD +# define compatnldata RTA_DATA +#else +# include <xen/features.h> +# define compatnlattr nlattr +# define compatnllen nla_len +# define compatnldata nla_data +#endif + /* xenbus directory */ #define FIFO_BUF (10*1024*1024) @@ -43,6 +61,7 @@ struct tc_queue_qopt { int action; }; +#ifdef OLDKERNEL /* borrowed from drivers/xen/netback/loopback.c */ #ifdef CONFIG_X86 static int is_foreign(unsigned long pfn) @@ -88,6 +107,12 @@ static int skb_remove_foreign_references return 1; } +#else /* OLDKERNEL */ +static int skb_remove_foreign_references(struct sk_buff *skb) +{ + return !skb_linearize(skb); +} +#endif /* OLDKERNEL */ static int queue_enqueue(struct sk_buff *skb, struct Qdisc* sch) { @@ -112,7 +137,7 @@ static int queue_enqueue(struct sk_buff /* dequeue doesn't actually dequeue until the release command is * received. */ -static inline struct sk_buff *queue_dequeue(struct Qdisc* sch) +static struct sk_buff *queue_dequeue(struct Qdisc* sch) { struct queue_sched_data *q = qdisc_priv(sch); struct sk_buff* peek; @@ -145,7 +170,7 @@ static inline struct sk_buff *queue_dequ return qdisc_dequeue_head(sch); } -static int queue_init(struct Qdisc *sch, struct rtattr *opt) +static int queue_init(struct Qdisc *sch, struct compatnlattr *opt) { sch->flags |= TCQ_F_THROTTLED; @@ -155,7 +180,7 @@ static int queue_init(struct Qdisc *sch, /* receives two messages: * 0: checkpoint queue (set stop to next packet) * 1: dequeue until stop */ -static int queue_change(struct Qdisc* sch, struct rtattr* opt) +static int queue_change(struct Qdisc* sch, struct compatnlattr* opt) { struct queue_sched_data *q = qdisc_priv(sch); struct tc_queue_qopt* msg; @@ -163,10 +188,10 @@ static int queue_change(struct Qdisc* sc struct timeval tv; */ - if (!opt || RTA_PAYLOAD(opt) < sizeof(*msg)) + if (!opt || compatnllen(opt) < sizeof(*msg)) return -EINVAL; - msg = RTA_DATA(opt); + msg = compatnldata(opt); if (msg->action == TCQ_CHECKPOINT) { /* reset stop */ @@ -174,7 +199,11 @@ static int queue_change(struct Qdisc* sc } else if (msg->action == TCQ_DEQUEUE) { /* dequeue */ sch->flags &= ~TCQ_F_THROTTLED; +#ifdef OLDKERNEL netif_schedule(sch->dev); +#else + netif_schedule_queue(sch->dev_queue); +#endif /* do_gettimeofday(&tv); printk("queue release at %lu.%06lu (%d bytes)\n", tv.tv_sec, tv.tv_usec, @@ -192,8 +221,11 @@ struct Qdisc_ops queue_qdisc_ops = { .priv_size = sizeof(struct queue_sched_data), .enqueue = queue_enqueue, .dequeue = queue_dequeue, - .init = queue_init, - .change = queue_change, +#ifndef OLDKERNEL + .peek = qdisc_peek_head, +#endif + .init = queue_init, + .change = queue_change, .owner = THIS_MODULE, }; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |