-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[net/9p] Preparation and helper functions for zero copy
This patch prepares p9_fcall structure for zero copy. Added fields send the payload buffer information to the transport layer. In addition it adds a 'private' field for the transport layer to store mapped/pinned page information so that it can be freed/unpinned during req_done. This patch also creates trans_common.[ch] to house helper functions. It adds the following helper functions. p9_release_req_pages - Release pages after the transaction. p9_nr_pages - Return number of pages needed to accomodate the payload. payload_gup - Translates user buffer into kernel pages. Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
- Loading branch information
Venkateswararao Jujjuri (JV)
authored and
Eric Van Hensbergen
committed
Mar 15, 2011
1 parent
6752a1e
commit 022cae3
Showing
5 changed files
with
139 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
/* | ||
* Copyright IBM Corporation, 2010 | ||
* Author Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of version 2.1 of the GNU Lesser General Public License | ||
* as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it would be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
* | ||
*/ | ||
|
||
#include <linux/slab.h> | ||
#include <linux/module.h> | ||
#include <net/9p/9p.h> | ||
#include <net/9p/client.h> | ||
#include <linux/scatterlist.h> | ||
#include "trans_common.h" | ||
|
||
/** | ||
* p9_release_req_pages - Release pages after the transaction. | ||
* @*private: PDU's private page of struct trans_rpage_info | ||
*/ | ||
void | ||
p9_release_req_pages(struct trans_rpage_info *rpinfo) | ||
{ | ||
int i = 0; | ||
|
||
while (rpinfo->rp_data[i] && rpinfo->rp_nr_pages--) { | ||
put_page(rpinfo->rp_data[i]); | ||
i++; | ||
} | ||
} | ||
EXPORT_SYMBOL(p9_release_req_pages); | ||
|
||
/** | ||
* p9_nr_pages - Return number of pages needed to accomodate the payload. | ||
*/ | ||
int | ||
p9_nr_pages(struct p9_req_t *req) | ||
{ | ||
int start_page, end_page; | ||
start_page = (unsigned long long)req->tc->pubuf >> PAGE_SHIFT; | ||
end_page = ((unsigned long long)req->tc->pubuf + req->tc->pbuf_size + | ||
PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
return end_page - start_page; | ||
} | ||
EXPORT_SYMBOL(p9_nr_pages); | ||
|
||
/** | ||
* payload_gup - Translates user buffer into kernel pages and | ||
* pins them either for read/write through get_user_pages_fast(). | ||
* @req: Request to be sent to server. | ||
* @pdata_off: data offset into the first page after translation (gup). | ||
* @pdata_len: Total length of the IO. gup may not return requested # of pages. | ||
* @nr_pages: number of pages to accomodate the payload | ||
* @rw: Indicates if the pages are for read or write. | ||
*/ | ||
int | ||
p9_payload_gup(struct p9_req_t *req, size_t *pdata_off, int *pdata_len, | ||
int nr_pages, u8 rw) | ||
{ | ||
uint32_t first_page_bytes = 0; | ||
uint32_t pdata_mapped_pages; | ||
struct trans_rpage_info *rpinfo; | ||
|
||
*pdata_off = (size_t)req->tc->pubuf & (PAGE_SIZE-1); | ||
|
||
if (*pdata_off) | ||
first_page_bytes = min((PAGE_SIZE - *pdata_off), | ||
req->tc->pbuf_size); | ||
|
||
rpinfo = req->tc->private; | ||
pdata_mapped_pages = get_user_pages_fast((unsigned long)req->tc->pubuf, | ||
nr_pages, rw, &rpinfo->rp_data[0]); | ||
|
||
if (pdata_mapped_pages < 0) { | ||
printk(KERN_ERR "get_user_pages_fast failed:%d udata:%p" | ||
"nr_pages:%d\n", pdata_mapped_pages, | ||
req->tc->pubuf, nr_pages); | ||
pdata_mapped_pages = 0; | ||
return -EIO; | ||
} | ||
rpinfo->rp_nr_pages = pdata_mapped_pages; | ||
if (*pdata_off) { | ||
*pdata_len = first_page_bytes; | ||
*pdata_len += min((req->tc->pbuf_size - *pdata_len), | ||
((size_t)pdata_mapped_pages - 1) << PAGE_SHIFT); | ||
} else { | ||
*pdata_len = min(req->tc->pbuf_size, | ||
(size_t)pdata_mapped_pages << PAGE_SHIFT); | ||
} | ||
return 0; | ||
} | ||
EXPORT_SYMBOL(p9_payload_gup); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* | ||
* Copyright IBM Corporation, 2010 | ||
* Author Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of version 2.1 of the GNU Lesser General Public License | ||
* as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it would be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | ||
* | ||
*/ | ||
|
||
/** | ||
* struct trans_rpage_info - To store mapped page information in PDU. | ||
* @rp_alloc:Set if this structure is allocd, not a reuse unused space in pdu. | ||
* @rp_nr_pages: Number of mapped pages | ||
* @rp_data: Array of page pointers | ||
*/ | ||
struct trans_rpage_info { | ||
u8 rp_alloc; | ||
int rp_nr_pages; | ||
struct page *rp_data[0]; | ||
}; | ||
|
||
void p9_release_req_pages(struct trans_rpage_info *); | ||
int p9_payload_gup(struct p9_req_t *, size_t *, int *, int, u8); | ||
int p9_nr_pages(struct p9_req_t *); |