aboutsummaryrefslogtreecommitdiff
path: root/src/cyber_file.c
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@gmail.com>2017-02-25 17:49:34 +0100
committerFelix Morgner <felix.morgner@gmail.com>2017-02-25 18:03:12 +0100
commit3f447f5105beff5d4a82461a09fddc448761bcdd (patch)
tree9552a7a4bd0853c9741dbd9f325583320fc7dfea /src/cyber_file.c
parent8466ba397d04f24e97b06f4117e8f0ab2c1e0e48 (diff)
downloaddev-cyber-3f447f5105beff5d4a82461a09fddc448761bcdd.tar.xz
dev-cyber-3f447f5105beff5d4a82461a09fddc448761bcdd.zip
cyber_file: enable large-chunk CYBER readsv42.1337.666
Allowing for reading CYBER in much larger chunks boosts read perfomance on the Designated CYBER Test System (DCTS) from 4.2 Gibibyte per second to 6.66 Gibibyte per second. All hail CYBER!
Diffstat (limited to 'src/cyber_file.c')
-rw-r--r--src/cyber_file.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/cyber_file.c b/src/cyber_file.c
index d7264c1..deaed39 100644
--- a/src/cyber_file.c
+++ b/src/cyber_file.c
@@ -39,12 +39,19 @@ int cyber_file_open(struct inode * inode, struct file * file)
ssize_t cyber_file_read(struct file * file, char __user * buffer, size_t size, loff_t * offset)
{
- int const cybers = (size > PAGE_SIZE ? PAGE_SIZE : size) / 8;
- if(copy_to_user(buffer, cyberSpace, cybers * 8))
+ int const cyberChunks = (size + PAGE_SIZE - 1) / PAGE_SIZE;
+ int const cybersPerChunk = (size > PAGE_SIZE ? PAGE_SIZE : size) / 8;
+ int remainingChunks = cyberChunks;
+
+ for(; remainingChunks > 0; --remainingChunks)
{
- return -EFAULT;
+ if(copy_to_user(buffer, cyberSpace, cybersPerChunk * 8))
+ {
+ return -EFAULT;
+ }
}
- return cybers * 8;
+
+ return cyberChunks * cybersPerChunk * 8;
}
ssize_t cyber_file_write(struct file * file, char __user const * buffer, size_t size, loff_t * offset)