For the out of tree OVS module, the network stack recursion limit are some times lower than the default value enforced by dev.c. example that the default
This patch implements a lower limit, than the limit enforced by dev,c, to accommodate some OVS use cases that involves higher stack usage. For example, OVS + IPsec. Signed-off-by: Andy Zhou <az...@nicira.com> --- datapath/linux/compat/vport.h | 24 ++++++++++++++++++++++++ datapath/vport.c | 4 ++-- datapath/vport.h | 8 +++++++- 3 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 datapath/linux/compat/vport.h diff --git a/datapath/linux/compat/vport.h b/datapath/linux/compat/vport.h new file mode 100644 index 0000000..772f2c5 --- /dev/null +++ b/datapath/linux/compat/vport.h @@ -0,0 +1,24 @@ +#ifndef __NET_OEPNVSWITCH_VPORT_WRAPPER_H +#define __NET_OEPNVSWITCH_VPORT_WRAPPER_H + +#include_next "vport.h" + +DECLARE_PER_CPU(int, ovs_exec_actions_count); +#define OVS_OUTPUT_LOOP_LIMIT 4 + +static inline int rpl_ovs_vport_send(struct vport *p, struct sk_buff *skb) +{ + if (this_cpu_read(ovs_exec_actions_count) > OVS_OUTPUT_LOOP_LIMIT) { + if(net_ratelimit()) + pr_info("OVS output loop limit reached, drop. \n"); + kfree_skb(skb); + return 0; + } + + return ovs_vport_send(p, skb); +} + +#define ovs_vport_send rpl_ovs_vport_send + +#endif + diff --git a/datapath/vport.c b/datapath/vport.c index 37e0edc..ac72ee0 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -499,7 +499,7 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb, } /** - * ovs_vport_send - send a packet on a device + * ovs_vport_send_packet - send a packet on a device * * @vport: vport on which to send the packet * @skb: skb to send @@ -507,7 +507,7 @@ void ovs_vport_receive(struct vport *vport, struct sk_buff *skb, * Sends the given packet and returns the length of data sent. Either ovs * lock or rcu_read_lock must be held. */ -int ovs_vport_send(struct vport *vport, struct sk_buff *skb) +int ovs_vport_send_packet(struct vport *vport, struct sk_buff *skb) { int sent = vport->ops->send(vport, skb); diff --git a/datapath/vport.h b/datapath/vport.h index 8c3da05..c1d6a80 100644 --- a/datapath/vport.h +++ b/datapath/vport.h @@ -55,7 +55,7 @@ int ovs_vport_set_upcall_portids(struct vport *, struct nlattr *pids); int ovs_vport_get_upcall_portids(const struct vport *, struct sk_buff *); u32 ovs_vport_find_upcall_portid(const struct vport *, struct sk_buff *); -int ovs_vport_send(struct vport *, struct sk_buff *); +int ovs_vport_send_packet(struct vport * vport, struct sk_buff * skb); int ovs_tunnel_get_egress_info(struct ovs_tunnel_info *egress_tun_info, struct net *net, @@ -243,4 +243,10 @@ static inline void ovs_skb_postpush_rcsum(struct sk_buff *skb, if (skb->ip_summed == CHECKSUM_COMPLETE) skb->csum = csum_add(skb->csum, csum_partial(start, len, 0)); } + +static inline int ovs_vport_send(struct vport *vport, struct sk_buff *skb) +{ + return ovs_vport_send_packet(vport, skb); +} + #endif /* vport.h */ -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev