aboutsummaryrefslogtreecommitdiff
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
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!
-rw-r--r--README.rst2
-rw-r--r--src/cyber.c2
-rw-r--r--src/cyber_file.c15
3 files changed, 13 insertions, 6 deletions
diff --git a/README.rst b/README.rst
index df69293..0936c93 100644
--- a/README.rst
+++ b/README.rst
@@ -12,7 +12,7 @@ Purism Librem 13):
- High throughput access to **CYBER** space
- - Up-to 4.2 Gibibyte per second read speed
+ - Up-to 6.66 Gibibyte per second read speed
- Up-to 12 Gibibyte per second write speed
- Unlimited storage
diff --git a/src/cyber.c b/src/cyber.c
index 3f454af..c19d9ec 100644
--- a/src/cyber.c
+++ b/src/cyber.c
@@ -25,5 +25,5 @@
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Felix Morgner");
-MODULE_VERSION("42.1337");
+MODULE_VERSION("42.1337.666");
MODULE_DESCRIPTION("Add CYBER to your system");
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)