mirror of
https://github.com/SCST-project/scst.git
synced 2026-08-20 06:06:23 +00:00
svn+ssh://yanb123@svn.code.sf.net/p/scst/svn/trunk
........
r5409 | bvassche | 2014-04-06 23:13:53 +0300 (Sun, 06 Apr 2014) | 4 lines
scstadmin: Restore LUNs in "scstadmin -list_sessions" output
Signed-off-by: Dave Butler <tears.the@gmail.com>
........
r5410 | bvassche | 2014-04-06 23:26:08 +0300 (Sun, 06 Apr 2014) | 1 line
scstadmin: List keys alphabetically in the -list_sessions output
........
r5411 | vlnb | 2014-04-10 02:58:20 +0300 (Thu, 10 Apr 2014) | 10 lines
vdisk_blockio: Specify REQ_SYNC for synchronous I/O requests
Using READ_SYNC instead of READ increases the priority of read requests.
Using WRITE_SYNC instead of REQ_WRITE increases the priority of write
requests and avoids that the CFQ scheduler queues such writes waiting
for further write requests.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
........
r5412 | vlnb | 2014-04-10 02:59:02 +0300 (Thu, 10 Apr 2014) | 18 lines
vdisk_blockio: Reenable COMPARE AND WRITE
The COMPARE AND WRITE implementation has been tested as follows against
an SCST vdisk_blockio device:
lba=7
bdev=$bdev
for ((i=0;i<4;i++)); do dd if=/dev/urandom of=b$i bs=8k count=1; done
for p in "0 1" "1 2" "2 3" "3 0"; do set $p; cat b$1 b$2 >b$1$2; done
dd if=/dev/urandom of=$bdev
dd if=b0 of=$bdev seek=$lba
md5sum $bdev
for ((i=0;i<10000;i++)); do for f in b01 b12 b23 b30; do sg_compare_and_write -l $lba -i $f -n 16 -x 16384 $bdev; done; done
md5sum $bdev
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
........
r5413 | bvassche | 2014-04-15 09:03:59 +0300 (Tue, 15 Apr 2014) | 1 line
ib_srpt: Fix a sparse warning
........
r5414 | vlnb | 2014-04-16 00:26:06 +0300 (Wed, 16 Apr 2014) | 5 lines
Fix READ(6)/WRITE(6)
LBA in those commands is 3 bytes long, not 2.
........
r5415 | vlnb | 2014-04-16 00:30:26 +0300 (Wed, 16 Apr 2014) | 3 lines
Add SYNCHRONIZE_CACHE(16)
........
r5416 | vlnb | 2014-04-16 01:04:54 +0300 (Wed, 16 Apr 2014) | 6 lines
Make HEAD OF QUEUE requests sync
Since the block layer has no way to specify bio as HQ, there's no
choice, but to use every measure to approximate it as close as possible.
........
r5417 | vlnb | 2014-04-16 01:17:34 +0300 (Wed, 16 Apr 2014) | 3 lines
Add NULLIO VERIFY
........
r5418 | vlnb | 2014-04-16 04:02:50 +0300 (Wed, 16 Apr 2014) | 3 lines
REPORT SUPPORTED OPERATION CODES added
........
r5419 | vlnb | 2014-04-16 04:05:49 +0300 (Wed, 16 Apr 2014) | 3 lines
Cleanup
........
r5420 | vlnb | 2014-04-16 05:24:44 +0300 (Wed, 16 Apr 2014) | 3 lines
Follow up for r5418: some cleanups and fixes
........
r5421 | bvassche | 2014-04-16 09:17:19 +0300 (Wed, 16 Apr 2014) | 6 lines
scst_targ: Fix a checkpatch complaint
Avoid that checkpatch reports the following message:
ERROR: space required before the open parenthesis '('
........
r5422 | bvassche | 2014-04-16 09:35:19 +0300 (Wed, 16 Apr 2014) | 1 line
scst_vdisk: Build fix for kernels < 2.6.36 (see also r5416)
........
r5423 | bvassche | 2014-04-16 10:30:34 +0300 (Wed, 16 Apr 2014) | 6 lines
ib_srpt: Disable RDMA access by the initiator
With the SRP protocol all RDMA operations are initiated by the target.
Since no RDMA operations are initiated by the initiator, do not grant
the initiator permission to submit RDMA reads or writes to the target.
........
r5424 | bvassche | 2014-04-16 11:01:58 +0300 (Wed, 16 Apr 2014) | 1 line
ib_srpt: Constify two arguments of srpt_get_nexus()
........
r5425 | bvassche | 2014-04-16 11:08:50 +0300 (Wed, 16 Apr 2014) | 1 line
ib_srpt: Clean up the code that prints the dgid during login
........
r5426 | bvassche | 2014-04-16 11:23:11 +0300 (Wed, 16 Apr 2014) | 1 line
ib_srpt: Cache P_Key lookups
........
r5427 | bvassche | 2014-04-16 12:14:31 +0300 (Wed, 16 Apr 2014) | 1 line
ib_srpt: Remove a superfluous assignment
........
r5428 | bvassche | 2014-04-16 12:31:56 +0300 (Wed, 16 Apr 2014) | 1 line
scst_vdisk: Avoid that checkpatch complains about unnecessary line continuations
........
r5429 | bvassche | 2014-04-16 12:35:18 +0300 (Wed, 16 Apr 2014) | 1 line
scst_lib: Avoid that checkpatch complains about unnecessary line continuations
........
r5430 | bvassche | 2014-04-17 09:09:41 +0300 (Thu, 17 Apr 2014) | 1 line
scst_vdisk: Kernel 2.6.27 build fix
........
r5431 | bvassche | 2014-04-17 09:12:07 +0300 (Thu, 17 Apr 2014) | 5 lines
scst_vdisk: Fix a kernel 2.6.27 compiler warning
Avoid that the compiler reports that variables 'start_sector' and 'nr_sects'
are set but not used when building against kernel 2.6.27.
........
r5432 | vlnb | 2014-04-18 03:32:51 +0300 (Fri, 18 Apr 2014) | 3 lines
Update to kernels 3.14
........
r5433 | bvassche | 2014-04-18 08:50:04 +0300 (Fri, 18 Apr 2014) | 1 line
nightly build: Add kernel 3.14 build infrastructure
........
r5434 | bvassche | 2014-04-18 08:54:29 +0300 (Fri, 18 Apr 2014) | 1 line
nightly build: Add kernel version 3.14.1 and update other kernel versions
........
r5435 | bvassche | 2014-04-18 08:56:35 +0300 (Fri, 18 Apr 2014) | 6 lines
iscsi-scst: Fix a checkpatch warning
Fix the following checkpatch 3.14 warning:
Unnecessary parentheses - maybe == should be = ?
........
r5436 | bvassche | 2014-04-18 09:03:34 +0300 (Fri, 18 Apr 2014) | 6 lines
scst.h: Fix a checkpatch warning
Fix the following checkpatch 3.14 warning:
Unnecessary space after function pointer name
........
r5437 | bvassche | 2014-04-18 09:08:07 +0300 (Fri, 18 Apr 2014) | 6 lines
scst: Fix a checkpatch warning
Fix the following checkpatch 3.14 warning:
Unnecessary space after function pointer name
........
r5438 | bvassche | 2014-04-18 09:13:03 +0300 (Fri, 18 Apr 2014) | 6 lines
scst: Fix a checkpatch 3.14 warning about whitespace
Fix the following checkpatch 3.14 warning:
missing space after return type
........
r5439 | bvassche | 2014-04-18 14:09:55 +0300 (Fri, 18 Apr 2014) | 1 line
ib_srpt: Update README
........
r5440 | bvassche | 2014-04-18 15:04:05 +0300 (Fri, 18 Apr 2014) | 2 lines
ib_srpt: Move IB/CM knowledge out of srpt_cm_req_recv()
........
r5441 | bvassche | 2014-04-18 15:08:00 +0300 (Fri, 18 Apr 2014) | 6 lines
ib_srpt: Remove a superfluous check from the REQ handler
ib_send_cm_rep() checks the connection state before sending a response.
Hence checking ch->state before calling ib_send_cm_rep() is superfluous,
so remove that check and also the locking that is no longer needed.
........
r5442 | bvassche | 2014-04-18 15:09:33 +0300 (Fri, 18 Apr 2014) | 5 lines
ib_srpt: Prepare RDMA/CM support
Move IB/CM members into a new struct. Report channel pointer instead of CM ID
pointer in diagnostic messages.
........
r5443 | bvassche | 2014-04-18 15:10:47 +0300 (Fri, 18 Apr 2014) | 5 lines
ib_srpt: Use a mutex instead of a spinlock to protect the channel list
This is allowed because all CM callback functions are invoked from thread
context.
........
r5444 | bvassche | 2014-04-18 15:11:18 +0300 (Fri, 18 Apr 2014) | 2 lines
ib_srpt: Move the code for checking the QP timeout
........
r5445 | bvassche | 2014-04-18 15:22:30 +0300 (Fri, 18 Apr 2014) | 4 lines
ib_srpt: Add RDMA/CM support
Or in other words, add RoCE and iWARP support.
........
r5446 | bvassche | 2014-04-18 15:38:39 +0300 (Fri, 18 Apr 2014) | 1 line
ib_srpt: Build fix for kernel versions < 3.0
........
r5447 | bvassche | 2014-04-18 15:44:48 +0300 (Fri, 18 Apr 2014) | 1 line
ib_srpt: RHEL 6.5 build fix
........
r5448 | bvassche | 2014-04-19 14:48:33 +0300 (Sat, 19 Apr 2014) | 1 line
scst_vdisk, COMPARE AND WRITE: Convert a kernel warning into a SCSI sense code
........
r5449 | bvassche | 2014-04-19 14:52:34 +0300 (Sat, 19 Apr 2014) | 33 lines
vdisk_blockio: Make COMPARE AND WRITE compatible with the scsi_debug driver
This patch fixes the following kernel oops:
BUG: unable to handle kernel paging request at ffffeae380000690
Call Trace:
[<ffffffff812f69f9>] sg_miter_next+0x9/0xd0
[<ffffffff812f6b60>] sg_copy_buffer+0xa0/0x100
[<ffffffffa0507fc6>] do_device_access.isra.8+0xa6/0x150 [scsi_debug]
[<ffffffffa05085f4>] resp_read+0xe4/0x240 [scsi_debug]
[<ffffffffa050b285>] scsi_debug_queuecommand_lck+0x11e5/0x2060 [scsi_debug]
[<ffffffffa050c130>] scsi_debug_queuecommand+0x30/0x48 [scsi_debug]
[<ffffffff813fe23f>] scsi_dispatch_cmd+0xaf/0x260
[<ffffffff814068ed>] scsi_request_fn+0x32d/0x540
[<ffffffff812bda2a>] __blk_run_queue+0x2a/0x40
[<ffffffff812c25a4>] blk_queue_bio+0x274/0x350
[<ffffffff812bd878>] generic_make_request+0xa8/0xf0
[<ffffffff812bd92c>] submit_bio+0x6c/0x140
[<ffffffffa06247f6>] blockio_rw_sync.isra.29+0x106/0x170 [scst_vdisk]
[<ffffffffa0629bf9>] vdisk_exec_caw+0xd9/0x3c0 [scst_vdisk]
[<ffffffffa061ff5e>] vdev_do_job+0x9e/0x320 [scst_vdisk]
[<ffffffffa0622c47>] non_fileio_exec+0x57/0xd0 [scst_vdisk]
[<ffffffffa054cde2>] scst_do_real_exec+0x92/0x3b0 [scst]
[<ffffffffa05502d2>] scst_exec_check_blocking+0xe2/0x300 [scst]
[<ffffffffa055066b>] scst_exec_check_sn+0x17b/0x2d0 [scst]
[<ffffffffa0553231>] scst_process_active_cmd+0x431/0x770 [scst]
[<ffffffffa0554a0a>] scst_do_job_active+0xea/0x180 [scst]
[<ffffffffa0554bc6>] scst_cmd_thread+0x126/0x290 [scst]
[<ffffffff81075241>] kthread+0xc1/0xe0
[<ffffffff81598ccc>] ret_from_fork+0x7c/0xb0
Reported-by: Sebastian Herbszt <herbszt@gmx.de>
........
r5450 | bvassche | 2014-04-20 09:24:23 +0300 (Sun, 20 Apr 2014) | 1 line
iscsi-scst/kernel/patches/put_page_callback-3.2.57.patch: Add
........
r5451 | bvassche | 2014-04-22 09:56:37 +0300 (Tue, 22 Apr 2014) | 1 line
scst: Revert r5438, a whitespace-only change
........
r5452 | bvassche | 2014-04-22 10:05:21 +0300 (Tue, 22 Apr 2014) | 1 line
scripts/run-regression-tests: Suppress the checkpatch warning "missing space after return type"
........
r5454 | bvassche | 2014-04-22 10:32:44 +0300 (Tue, 22 Apr 2014) | 1 line
scst/README: Update the section about Linux initiator ALUA support
........
git-svn-id: http://svn.code.sf.net/p/scst/svn/branches/iser@5455 d57e44dd-8a1f-0410-8b47-8ef2f437770f
365 lines
11 KiB
Diff
365 lines
11 KiB
Diff
=== modified file 'drivers/block/drbd/drbd_receiver.c'
|
|
--- old/drivers/block/drbd/drbd_receiver.c 2014-04-17 22:02:06 +0000
|
|
+++ new/drivers/block/drbd/drbd_receiver.c 2014-04-17 22:48:38 +0000
|
|
@@ -130,7 +130,7 @@ static int page_chain_free(struct page *
|
|
struct page *tmp;
|
|
int i = 0;
|
|
page_chain_for_each_safe(page, tmp) {
|
|
- put_page(page);
|
|
+ net_put_page(page);
|
|
++i;
|
|
}
|
|
return i;
|
|
|
|
=== modified file 'include/linux/mm_types.h'
|
|
--- old/include/linux/mm_types.h 2014-04-17 22:02:06 +0000
|
|
+++ new/include/linux/mm_types.h 2014-04-17 22:48:38 +0000
|
|
@@ -195,6 +195,17 @@ struct page {
|
|
#ifdef LAST_CPUPID_NOT_IN_PAGE_FLAGS
|
|
int _last_cpupid;
|
|
#endif
|
|
+
|
|
+#if defined(CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION)
|
|
+ /*
|
|
+ * Used to implement support for notification on zero-copy TCP transfer
|
|
+ * completion. It might look as not good to have this field here and
|
|
+ * it's better to have it in struct sk_buff, but it would make the code
|
|
+ * much more complicated and fragile, since all skb then would have to
|
|
+ * contain only pages with the same value in this field.
|
|
+ */
|
|
+ void *net_priv;
|
|
+#endif
|
|
}
|
|
/*
|
|
* The struct page can be forced to be double word aligned so that atomic ops
|
|
|
|
=== modified file 'include/linux/net.h'
|
|
--- old/include/linux/net.h 2014-04-17 22:02:06 +0000
|
|
+++ new/include/linux/net.h 2014-04-17 22:48:38 +0000
|
|
@@ -19,6 +19,7 @@
|
|
#define _LINUX_NET_H
|
|
|
|
#include <linux/stringify.h>
|
|
+#include <linux/mm.h>
|
|
#include <linux/random.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/fcntl.h> /* For O_CLOEXEC and O_NONBLOCK */
|
|
@@ -292,6 +293,45 @@ int kernel_sendpage(struct socket *sock,
|
|
int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg);
|
|
int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how);
|
|
|
|
+#if defined(CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION)
|
|
+/* Support for notification on zero-copy TCP transfer completion */
|
|
+typedef void (*net_get_page_callback_t)(struct page *page);
|
|
+typedef void (*net_put_page_callback_t)(struct page *page);
|
|
+
|
|
+extern net_get_page_callback_t net_get_page_callback;
|
|
+extern net_put_page_callback_t net_put_page_callback;
|
|
+
|
|
+extern int net_set_get_put_page_callbacks(
|
|
+ net_get_page_callback_t get_callback,
|
|
+ net_put_page_callback_t put_callback);
|
|
+
|
|
+/*
|
|
+ * See comment for net_set_get_put_page_callbacks() why those functions
|
|
+ * don't need any protection.
|
|
+ */
|
|
+static inline void net_get_page(struct page *page)
|
|
+{
|
|
+ if (page->net_priv != 0)
|
|
+ net_get_page_callback(page);
|
|
+ get_page(page);
|
|
+}
|
|
+static inline void net_put_page(struct page *page)
|
|
+{
|
|
+ if (page->net_priv != 0)
|
|
+ net_put_page_callback(page);
|
|
+ put_page(page);
|
|
+}
|
|
+#else
|
|
+static inline void net_get_page(struct page *page)
|
|
+{
|
|
+ get_page(page);
|
|
+}
|
|
+static inline void net_put_page(struct page *page)
|
|
+{
|
|
+ put_page(page);
|
|
+}
|
|
+#endif /* CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION */
|
|
+
|
|
#define MODULE_ALIAS_NETPROTO(proto) \
|
|
MODULE_ALIAS("net-pf-" __stringify(proto))
|
|
|
|
|
|
=== modified file 'include/linux/skbuff.h'
|
|
--- old/include/linux/skbuff.h 2014-04-17 22:02:06 +0000
|
|
+++ new/include/linux/skbuff.h 2014-04-17 22:48:38 +0000
|
|
@@ -2056,7 +2056,7 @@ static inline struct page *skb_frag_page
|
|
*/
|
|
static inline void __skb_frag_ref(skb_frag_t *frag)
|
|
{
|
|
- get_page(skb_frag_page(frag));
|
|
+ net_get_page(skb_frag_page(frag));
|
|
}
|
|
|
|
/**
|
|
@@ -2079,7 +2079,7 @@ static inline void skb_frag_ref(struct s
|
|
*/
|
|
static inline void __skb_frag_unref(skb_frag_t *frag)
|
|
{
|
|
- put_page(skb_frag_page(frag));
|
|
+ net_put_page(skb_frag_page(frag));
|
|
}
|
|
|
|
/**
|
|
|
|
=== modified file 'net/Kconfig'
|
|
--- old/net/Kconfig 2014-04-17 22:02:06 +0000
|
|
+++ new/net/Kconfig 2014-04-17 22:48:38 +0000
|
|
@@ -75,6 +75,18 @@ config INET
|
|
|
|
Short answer: say Y.
|
|
|
|
+config TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION
|
|
+ bool "TCP/IP zero-copy transfer completion notification"
|
|
+ depends on INET
|
|
+ default SCST_ISCSI
|
|
+ ---help---
|
|
+ Adds support for sending a notification upon completion of a
|
|
+ zero-copy TCP/IP transfer. This can speed up certain TCP/IP
|
|
+ software. Currently this is only used by the iSCSI target driver
|
|
+ iSCSI-SCST.
|
|
+
|
|
+ If unsure, say N.
|
|
+
|
|
if INET
|
|
source "net/ipv4/Kconfig"
|
|
source "net/ipv6/Kconfig"
|
|
|
|
=== modified file 'net/ceph/pagevec.c'
|
|
--- old/net/ceph/pagevec.c 2014-04-17 22:02:06 +0000
|
|
+++ new/net/ceph/pagevec.c 2014-04-17 22:48:38 +0000
|
|
@@ -51,7 +51,7 @@ void ceph_put_page_vector(struct page **
|
|
for (i = 0; i < num_pages; i++) {
|
|
if (dirty)
|
|
set_page_dirty_lock(pages[i]);
|
|
- put_page(pages[i]);
|
|
+ net_put_page(pages[i]);
|
|
}
|
|
kfree(pages);
|
|
}
|
|
|
|
=== modified file 'net/core/skbuff.c'
|
|
--- old/net/core/skbuff.c 2014-04-17 22:02:06 +0000
|
|
+++ new/net/core/skbuff.c 2014-04-17 22:48:38 +0000
|
|
@@ -425,7 +425,7 @@ struct sk_buff *__netdev_alloc_skb(struc
|
|
if (likely(data)) {
|
|
skb = build_skb(data, fragsz);
|
|
if (unlikely(!skb))
|
|
- put_page(virt_to_head_page(data));
|
|
+ net_put_page(virt_to_head_page(data));
|
|
}
|
|
} else {
|
|
skb = __alloc_skb(length + NET_SKB_PAD, gfp_mask,
|
|
@@ -483,7 +483,7 @@ static void skb_clone_fraglist(struct sk
|
|
static void skb_free_head(struct sk_buff *skb)
|
|
{
|
|
if (skb->head_frag)
|
|
- put_page(virt_to_head_page(skb->head));
|
|
+ net_put_page(virt_to_head_page(skb->head));
|
|
else
|
|
kfree(skb->head);
|
|
}
|
|
@@ -804,7 +804,7 @@ int skb_copy_ubufs(struct sk_buff *skb,
|
|
if (!page) {
|
|
while (head) {
|
|
struct page *next = (struct page *)page_private(head);
|
|
- put_page(head);
|
|
+ net_put_page(head);
|
|
head = next;
|
|
}
|
|
return -ENOMEM;
|
|
@@ -1647,7 +1647,7 @@ EXPORT_SYMBOL(skb_copy_bits);
|
|
*/
|
|
static void sock_spd_release(struct splice_pipe_desc *spd, unsigned int i)
|
|
{
|
|
- put_page(spd->pages[i]);
|
|
+ net_put_page(spd->pages[i]);
|
|
}
|
|
|
|
static struct page *linear_to_page(struct page *page, unsigned int *len,
|
|
@@ -1700,7 +1700,7 @@ static bool spd_fill_page(struct splice_
|
|
spd->partial[spd->nr_pages - 1].len += *len;
|
|
return false;
|
|
}
|
|
- get_page(page);
|
|
+ net_get_page(page);
|
|
spd->pages[spd->nr_pages] = page;
|
|
spd->partial[spd->nr_pages].len = *len;
|
|
spd->partial[spd->nr_pages].offset = offset;
|
|
@@ -2159,7 +2159,7 @@ skb_zerocopy(struct sk_buff *to, struct
|
|
page = virt_to_head_page(from->head);
|
|
offset = from->data - (unsigned char *)page_address(page);
|
|
__skb_fill_page_desc(to, 0, page, offset, plen);
|
|
- get_page(page);
|
|
+ net_get_page(page);
|
|
j = 1;
|
|
len -= plen;
|
|
}
|
|
@@ -2813,7 +2813,7 @@ int skb_append_datato_frags(struct sock
|
|
copy);
|
|
frg_cnt++;
|
|
pfrag->offset += copy;
|
|
- get_page(pfrag->page);
|
|
+ net_get_page(pfrag->page);
|
|
|
|
skb->truesize += copy;
|
|
atomic_add(copy, &sk->sk_wmem_alloc);
|
|
|
|
=== modified file 'net/core/sock.c'
|
|
--- old/net/core/sock.c 2014-04-17 22:02:06 +0000
|
|
+++ new/net/core/sock.c 2014-04-17 22:48:38 +0000
|
|
@@ -1839,7 +1839,7 @@ bool skb_page_frag_refill(unsigned int s
|
|
}
|
|
if (pfrag->offset + sz <= pfrag->size)
|
|
return true;
|
|
- put_page(pfrag->page);
|
|
+ net_put_page(pfrag->page);
|
|
}
|
|
|
|
order = SKB_FRAG_PAGE_ORDER;
|
|
@@ -2602,7 +2602,7 @@ void sk_common_release(struct sock *sk)
|
|
sk_refcnt_debug_release(sk);
|
|
|
|
if (sk->sk_frag.page) {
|
|
- put_page(sk->sk_frag.page);
|
|
+ net_put_page(sk->sk_frag.page);
|
|
sk->sk_frag.page = NULL;
|
|
}
|
|
|
|
|
|
=== modified file 'net/ipv4/Makefile'
|
|
--- old/net/ipv4/Makefile 2014-04-17 22:02:06 +0000
|
|
+++ new/net/ipv4/Makefile 2014-04-17 22:48:38 +0000
|
|
@@ -53,6 +53,7 @@ obj-$(CONFIG_TCP_CONG_YEAH) += tcp_yeah.
|
|
obj-$(CONFIG_TCP_CONG_ILLINOIS) += tcp_illinois.o
|
|
obj-$(CONFIG_MEMCG_KMEM) += tcp_memcontrol.o
|
|
obj-$(CONFIG_NETLABEL) += cipso_ipv4.o
|
|
+obj-$(CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION) += tcp_zero_copy.o
|
|
|
|
obj-$(CONFIG_XFRM) += xfrm4_policy.o xfrm4_state.o xfrm4_input.o \
|
|
xfrm4_output.o
|
|
|
|
=== modified file 'net/ipv4/ip_output.c'
|
|
--- old/net/ipv4/ip_output.c 2014-04-17 22:02:06 +0000
|
|
+++ new/net/ipv4/ip_output.c 2014-04-17 22:48:38 +0000
|
|
@@ -1004,7 +1004,7 @@ alloc_new_skb:
|
|
__skb_fill_page_desc(skb, i, pfrag->page,
|
|
pfrag->offset, 0);
|
|
skb_shinfo(skb)->nr_frags = ++i;
|
|
- get_page(pfrag->page);
|
|
+ net_get_page(pfrag->page);
|
|
}
|
|
copy = min_t(int, copy, pfrag->size - pfrag->offset);
|
|
if (getfrag(from,
|
|
@@ -1230,7 +1230,7 @@ ssize_t ip_append_page(struct sock *sk,
|
|
if (skb_can_coalesce(skb, i, page, offset)) {
|
|
skb_frag_size_add(&skb_shinfo(skb)->frags[i-1], len);
|
|
} else if (i < MAX_SKB_FRAGS) {
|
|
- get_page(page);
|
|
+ net_get_page(page);
|
|
skb_fill_page_desc(skb, i, page, offset, len);
|
|
} else {
|
|
err = -EMSGSIZE;
|
|
|
|
=== modified file 'net/ipv4/tcp.c'
|
|
--- old/net/ipv4/tcp.c 2014-04-17 22:02:06 +0000
|
|
+++ new/net/ipv4/tcp.c 2014-04-17 22:48:38 +0000
|
|
@@ -939,7 +939,7 @@ new_segment:
|
|
if (can_coalesce) {
|
|
skb_frag_size_add(&skb_shinfo(skb)->frags[i - 1], copy);
|
|
} else {
|
|
- get_page(page);
|
|
+ net_get_page(page);
|
|
skb_fill_page_desc(skb, i, page, offset, copy);
|
|
}
|
|
skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
|
|
@@ -1238,7 +1238,7 @@ new_segment:
|
|
} else {
|
|
skb_fill_page_desc(skb, i, pfrag->page,
|
|
pfrag->offset, copy);
|
|
- get_page(pfrag->page);
|
|
+ net_get_page(pfrag->page);
|
|
}
|
|
pfrag->offset += copy;
|
|
}
|
|
|
|
=== added file 'net/ipv4/tcp_zero_copy.c'
|
|
--- old/net/ipv4/tcp_zero_copy.c 1970-01-01 00:00:00 +0000
|
|
+++ new/net/ipv4/tcp_zero_copy.c 2014-04-17 22:48:38 +0000
|
|
@@ -0,0 +1,50 @@
|
|
+/*
|
|
+ * Support routines for TCP zero copy transmit
|
|
+ *
|
|
+ * Created by Vladislav Bolkhovitin
|
|
+ *
|
|
+ * This program is free software; you can redistribute it and/or
|
|
+ * modify it under the terms of the GNU General Public License
|
|
+ * version 2 as published by the Free Software Foundation.
|
|
+ */
|
|
+
|
|
+#include <linux/export.h>
|
|
+#include <linux/skbuff.h>
|
|
+
|
|
+net_get_page_callback_t net_get_page_callback __read_mostly;
|
|
+EXPORT_SYMBOL_GPL(net_get_page_callback);
|
|
+
|
|
+net_put_page_callback_t net_put_page_callback __read_mostly;
|
|
+EXPORT_SYMBOL_GPL(net_put_page_callback);
|
|
+
|
|
+/*
|
|
+ * Caller of this function must ensure that at the moment when it's called
|
|
+ * there are no pages in the system with net_priv field set to non-zero
|
|
+ * value. Hence, this function, as well as net_get_page() and net_put_page(),
|
|
+ * don't need any protection.
|
|
+ */
|
|
+int net_set_get_put_page_callbacks(
|
|
+ net_get_page_callback_t get_callback,
|
|
+ net_put_page_callback_t put_callback)
|
|
+{
|
|
+ int res = 0;
|
|
+
|
|
+ if ((net_get_page_callback != NULL) && (get_callback != NULL) &&
|
|
+ (net_get_page_callback != get_callback)) {
|
|
+ res = -EBUSY;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ if ((net_put_page_callback != NULL) && (put_callback != NULL) &&
|
|
+ (net_put_page_callback != put_callback)) {
|
|
+ res = -EBUSY;
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
+ net_get_page_callback = get_callback;
|
|
+ net_put_page_callback = put_callback;
|
|
+
|
|
+out:
|
|
+ return res;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(net_set_get_put_page_callbacks);
|
|
|
|
=== modified file 'net/ipv6/ip6_output.c'
|
|
--- old/net/ipv6/ip6_output.c 2014-04-17 22:02:06 +0000
|
|
+++ new/net/ipv6/ip6_output.c 2014-04-17 22:48:38 +0000
|
|
@@ -1455,7 +1455,7 @@ alloc_new_skb:
|
|
__skb_fill_page_desc(skb, i, pfrag->page,
|
|
pfrag->offset, 0);
|
|
skb_shinfo(skb)->nr_frags = ++i;
|
|
- get_page(pfrag->page);
|
|
+ net_get_page(pfrag->page);
|
|
}
|
|
copy = min_t(int, copy, pfrag->size - pfrag->offset);
|
|
if (getfrag(from,
|
|
|