From patchwork Fri Jan 25 14:27:06 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alex Bligh X-Patchwork-Id: 215745 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id CA3492C007C for ; Sat, 26 Jan 2013 01:38:00 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753252Ab3AYOh5 (ORCPT ); Fri, 25 Jan 2013 09:37:57 -0500 Received: from mail.avalus.com ([89.16.176.221]:59185 "EHLO mail.avalus.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751138Ab3AYOhz (ORCPT ); Fri, 25 Jan 2013 09:37:55 -0500 Received: by mail.avalus.com (Postfix) with ESMTPSA id A7759C561A0; Fri, 25 Jan 2013 14:27:23 +0000 (GMT) From: Alex Bligh To: netdev Cc: Stefano Stabellini , Ian Campbell , Alex Bligh , "Trond Myklebust" , Mel Gorman Subject: [RFC] [PATCH 6/7] net: add skb_frag_k(un)map convenience functions. Date: Fri, 25 Jan 2013 14:27:06 +0000 Message-Id: <1359124027-1170-7-git-send-email-alex@alex.org.uk> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1359124027-1170-1-git-send-email-alex@alex.org.uk> References: <1359124027-1170-1-git-send-email-alex@alex.org.uk> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ian Campbell Signed-off-by: Ian Campbell citrix.com> Cc: "David S. Miller" davemloft.net> Cc: Eric Dumazet gmail.com> Cc: "Michał Mirosław" rere.qmqm.pl> Cc: Tom Herbert google.com> Cc: Neil Horman tuxdriver.com> Cc: Koki Sanagi jp.fujitsu.com> Cc: linux-kernel vger.kernel.org Cc: netdev vger.kernel.org Signed-off-by: Alex Bligh --- include/linux/skbuff.h | 22 ++++++++++++++++++++++ net/core/datagram.c | 20 ++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 84a54d6..698e4c1 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -1868,6 +1868,28 @@ static inline void skb_frag_kunmap_atomic(void *vaddr) } /** + * skb_frag_kmap - kmaps a paged fragment + * @frag: the paged fragment + * + * kmap()s the paged fragment @frag and returns the virtual address. + */ +static inline void *skb_frag_kmap(const skb_frag_t *frag) +{ + return kmap(skb_frag_page(frag)); +} + +/** + * skb_frag_kunmap - kunmaps a paged fragment + * @frag: the paged fragment + * + * kunmap()s the paged fragment @frag. + */ +static inline void skb_frag_kunmap(const skb_frag_t *frag) +{ + kunmap(skb_frag_page(frag)); +} + +/** * skb_frag_dma_map - maps a paged fragment via the DMA API * @dev: the device to map the fragment to * @frag: the paged fragment to map diff --git a/net/core/datagram.c b/net/core/datagram.c index 68bbf9f..ac763d1 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c @@ -332,14 +332,13 @@ int skb_copy_datagram_iovec(const struct sk_buff *skb, int offset, if ((copy = end - offset) > 0) { int err; u8 *vaddr; - struct page *page = skb_frag_page(frag); if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = skb_frag_kmap(frag); err = memcpy_toiovec(to, vaddr + frag->page_offset + offset - start, copy); - kunmap(page); + skb_frag_kunmap(frag); if (err) goto fault; if (!(len -= copy)) @@ -418,14 +417,13 @@ int skb_copy_datagram_const_iovec(const struct sk_buff *skb, int offset, if ((copy = end - offset) > 0) { int err; u8 *vaddr; - struct page *page = skb_frag_page(frag); if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = skb_frag_kmap(frag); err = memcpy_toiovecend(to, vaddr + frag->page_offset + offset - start, to_offset, copy); - kunmap(page); + skb_frag_kunmap(frag); if (err) goto fault; if (!(len -= copy)) @@ -508,15 +506,14 @@ int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset, if ((copy = end - offset) > 0) { int err; u8 *vaddr; - struct page *page = skb_frag_page(frag); if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = skb_frag_kmap(frag); err = memcpy_fromiovecend(vaddr + frag->page_offset + offset - start, from, from_offset, copy); - kunmap(page); + skb_frag_kunmap(frag); if (err) goto fault; @@ -594,16 +591,15 @@ static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset, __wsum csum2; int err = 0; u8 *vaddr; - struct page *page = skb_frag_page(frag); if (copy > len) copy = len; - vaddr = kmap(page); + vaddr = skb_frag_kmap(frag); csum2 = csum_and_copy_to_user(vaddr + frag->page_offset + offset - start, to, copy, 0, &err); - kunmap(page); + skb_frag_kunmap(frag); if (err) goto fault; *csump = csum_block_add(*csump, csum2, pos);