Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/jesse/openvswitch
Jesse Gross says: ==================== [GIT net-next] Open vSwitch Open vSwitch changes for net-next/3.14. Highlights are: * Performance improvements in the mechanism to get packets to userspace using memory mapped netlink and skb zero copy where appropriate. * Per-cpu flow stats in situations where flows are likely to be shared across CPUs. Standard flow stats are used in other situations to save memory and allocation time. * A handful of code cleanups and rationalization. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -1773,6 +1773,9 @@ struct sk_buff *netlink_alloc_skb(struct sock *ssk, unsigned int size,
|
||||
if (ring->pg_vec == NULL)
|
||||
goto out_put;
|
||||
|
||||
if (ring->frame_size - NL_MMAP_HDRLEN < size)
|
||||
goto out_put;
|
||||
|
||||
skb = alloc_skb_head(gfp_mask);
|
||||
if (skb == NULL)
|
||||
goto err1;
|
||||
@@ -1782,6 +1785,7 @@ struct sk_buff *netlink_alloc_skb(struct sock *ssk, unsigned int size,
|
||||
if (ring->pg_vec == NULL)
|
||||
goto out_free;
|
||||
|
||||
/* check again under lock */
|
||||
maxlen = ring->frame_size - NL_MMAP_HDRLEN;
|
||||
if (maxlen < size)
|
||||
goto out_free;
|
||||
|
@@ -460,6 +460,26 @@ int genl_unregister_family(struct genl_family *family)
|
||||
}
|
||||
EXPORT_SYMBOL(genl_unregister_family);
|
||||
|
||||
/**
|
||||
* genlmsg_new_unicast - Allocate generic netlink message for unicast
|
||||
* @payload: size of the message payload
|
||||
* @info: information on destination
|
||||
* @flags: the type of memory to allocate
|
||||
*
|
||||
* Allocates a new sk_buff large enough to cover the specified payload
|
||||
* plus required Netlink headers. Will check receiving socket for
|
||||
* memory mapped i/o capability and use it if enabled. Will fall back
|
||||
* to non-mapped skb if message size exceeds the frame size of the ring.
|
||||
*/
|
||||
struct sk_buff *genlmsg_new_unicast(size_t payload, struct genl_info *info,
|
||||
gfp_t flags)
|
||||
{
|
||||
size_t len = nlmsg_total_size(genlmsg_total_size(payload));
|
||||
|
||||
return netlink_alloc_skb(info->dst_sk, len, info->snd_portid, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(genlmsg_new_unicast);
|
||||
|
||||
/**
|
||||
* genlmsg_put - Add generic netlink header to netlink message
|
||||
* @skb: socket buffer holding the message
|
||||
@@ -600,6 +620,7 @@ static int genl_family_rcv_msg(struct genl_family *family,
|
||||
info.genlhdr = nlmsg_data(nlh);
|
||||
info.userhdr = nlmsg_data(nlh) + GENL_HDRLEN;
|
||||
info.attrs = attrbuf;
|
||||
info.dst_sk = skb->sk;
|
||||
genl_info_net_set(&info, net);
|
||||
memset(&info.user_ptr, 0, sizeof(info.user_ptr));
|
||||
|
||||
|
Reference in New Issue
Block a user