mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Dmitry Kalinkin <dmitry.kalinkin@gmail.com>
To: linux-kernel@vger.kernel.org, devel@driverdev.osuosl.org
Cc: Martyn Welch <martyn.welch@ge.com>,
	Manohar Vanga <manohar.vanga@gmail.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Dmitry Kalinkin <dmitry.kalinkin@gmail.com>
Subject: [PATCHv2 5/9] staging: vme_user: allow large read()/write()
Date: Tue, 23 Jun 2015 19:03:35 +0300	[thread overview]
Message-ID: <1435075419-28211-6-git-send-email-dmitry.kalinkin@gmail.com> (raw)
In-Reply-To: <1435075419-28211-1-git-send-email-dmitry.kalinkin@gmail.com>

This changes large master transfers to do shorter read/write rather than
return -EINVAL. User space will now be able to optimistically request a
large transfer and get at least some data.

This also removes comments suggesting on how to implement large
transfers. Current vme_master_* read and write implementations use CPU
copies that don't produce burst PCI accesses and subsequently no block
transfer on VME bus. In the end overall performance is quiet low and it
can't be fixed by doing direct copy to user space. Much easier solution
would be to just reuse kernel buffer.

Signed-off-by: Dmitry Kalinkin <dmitry.kalinkin@gmail.com>
---
 drivers/staging/vme/devices/vme_user.c | 67 ++++++++++++----------------------
 1 file changed, 24 insertions(+), 43 deletions(-)

diff --git a/drivers/staging/vme/devices/vme_user.c b/drivers/staging/vme/devices/vme_user.c
index 3467cde..101f7b9 100644
--- a/drivers/staging/vme/devices/vme_user.c
+++ b/drivers/staging/vme/devices/vme_user.c
@@ -132,63 +132,44 @@ static ssize_t resource_to_user(int minor, char __user *buf, size_t count,
 	ssize_t retval;
 	ssize_t copied = 0;
 
-	if (count <= image[minor].size_buf) {
-		/* We copy to kernel buffer */
-		copied = vme_master_read(image[minor].resource,
-			image[minor].kern_buf, count, *ppos);
-		if (copied < 0)
-			return (int)copied;
-
-		retval = __copy_to_user(buf, image[minor].kern_buf,
-			(unsigned long)copied);
-		if (retval != 0) {
-			copied = (copied - retval);
-			pr_info("User copy failed\n");
-			return -EINVAL;
-		}
+	if (count > image[minor].size_buf)
+		count = image[minor].size_buf;
 
-	} else {
-		/* XXX Need to write this */
-		pr_info("Currently don't support large transfers\n");
-		/* Map in pages from userspace */
+	/* We copy to kernel buffer */
+	copied = vme_master_read(image[minor].resource, image[minor].kern_buf,
+				 count, *ppos);
+	if (copied < 0)
+		return (int)copied;
 
-		/* Call vme_master_read to do the transfer */
+	retval = __copy_to_user(buf, image[minor].kern_buf,
+				(unsigned long)copied);
+	if (retval != 0) {
+		copied = (copied - retval);
+		pr_info("User copy failed\n");
 		return -EINVAL;
 	}
 
 	return copied;
 }
 
-/*
- * We are going to alloc a page during init per window for small transfers.
- * Small transfers will go user space -> buffer -> VME. Larger (more than a
- * page) transfers will lock the user space buffer into memory and then
- * transfer the data directly from the user space buffers out to VME.
- */
 static ssize_t resource_from_user(unsigned int minor, const char __user *buf,
 				  size_t count, loff_t *ppos)
 {
 	ssize_t retval;
 	ssize_t copied = 0;
 
-	if (count <= image[minor].size_buf) {
-		retval = __copy_from_user(image[minor].kern_buf, buf,
-			(unsigned long)count);
-		if (retval != 0)
-			copied = (copied - retval);
-		else
-			copied = count;
-
-		copied = vme_master_write(image[minor].resource,
-			image[minor].kern_buf, copied, *ppos);
-	} else {
-		/* XXX Need to write this */
-		pr_info("Currently don't support large transfers\n");
-		/* Map in pages from userspace */
-
-		/* Call vme_master_write to do the transfer */
-		return -EINVAL;
-	}
+	if (count > image[minor].size_buf)
+		count = image[minor].size_buf;
+
+	retval = __copy_from_user(image[minor].kern_buf, buf,
+				  (unsigned long)count);
+	if (retval != 0)
+		copied = (copied - retval);
+	else
+		copied = count;
+
+	copied = vme_master_write(image[minor].resource, image[minor].kern_buf,
+				  copied, *ppos);
 
 	return copied;
 }
-- 
1.8.3.1


  parent reply	other threads:[~2015-06-23 16:04 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-23 12:42 [PATCH 0/9] vme_user checkpatch fixes and read()/write() rework Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 1/9] staging: vme_user: fix code alignment Dmitry Kalinkin
2015-06-23 13:21   ` Frans Klaver
2015-06-23 13:44     ` Dmitry Kalinkin
2015-06-23 13:43       ` Frans Klaver
2015-06-23 12:42 ` [PATCH 2/9] staging: vme_user: fix blank lines Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 3/9] staging: vme_user: fix NULL comparison style Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 4/9] staging: vme_user: fix kmalloc style Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 5/9] staging: vme_user: allow large read()/write() Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 6/9] staging: vme_user: return -EFAULT on __copy_*_user errors Dmitry Kalinkin
2015-06-23 13:51   ` Dan Carpenter
2015-06-23 14:13     ` Dmitry Kalinkin
2015-06-23 16:03     ` [PATCHv2 0/9] vme_user checkpatch fixes and read()/write() rework Dmitry Kalinkin
2015-06-23 16:03       ` [PATCHv2 1/9] staging: vme_user: fix code alignment Dmitry Kalinkin
2015-06-23 16:03       ` [PATCHv2 2/9] staging: vme_user: fix blank lines Dmitry Kalinkin
2015-06-23 16:03       ` [PATCHv2 3/9] staging: vme_user: fix NULL comparison style Dmitry Kalinkin
2015-06-23 16:03       ` [PATCHv2 4/9] staging: vme_user: fix kmalloc style Dmitry Kalinkin
2015-06-23 16:03       ` Dmitry Kalinkin [this message]
2015-06-23 16:03       ` [PATCHv2 6/9] staging: vme_user: return -EFAULT on __copy_*_user errors Dmitry Kalinkin
2015-06-25 11:27         ` Sudip Mukherjee
2015-06-25 12:05           ` Dmitry Kalinkin
2015-06-25 17:05             ` Dmitry Kalinkin
2015-07-06 12:42             ` Martyn Welch
2015-06-23 16:03       ` [PATCHv2 7/9] staging: vme_user: remove unused variable Dmitry Kalinkin
2015-06-23 16:03       ` [PATCHv2 8/9] staging: vme_user: remove distracting comment Dmitry Kalinkin
2015-06-23 16:03       ` [PATCHv2 9/9] staging: vme_user: remove okcount variable Dmitry Kalinkin
2015-06-26 20:39       ` [PATCHv3 0/9] vme_user checkpatch fixes and read()/write() rework Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 1/9] staging: vme_user: fix code alignment Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 2/9] staging: vme_user: fix blank lines Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 3/9] staging: vme_user: fix NULL comparison style Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 4/9] staging: vme_user: fix kmalloc style Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 5/9] staging: vme_user: allow large read()/write() Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 6/9] staging: vme_user: switch to returning -EFAULT on __copy_*_user errors Dmitry Kalinkin
2015-07-06 12:51           ` Martyn Welch
2015-07-06 13:10             ` Dmitry Kalinkin
2015-07-06 13:51               ` Martyn Welch
2015-06-26 20:39         ` [PATCHv3 7/9] staging: vme_user: remove unused variable Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 8/9] staging: vme_user: remove distracting comment Dmitry Kalinkin
2015-06-26 20:39         ` [PATCHv3 9/9] staging: vme_user: remove okcount variable Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 7/9] staging: vme_user: remove unused variable Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 8/9] staging: vme_user: remove distracting comment Dmitry Kalinkin
2015-06-23 12:42 ` [PATCH 9/9] staging: vme_user: remove okcount variable Dmitry Kalinkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1435075419-28211-6-git-send-email-dmitry.kalinkin@gmail.com \
    --to=dmitry.kalinkin@gmail.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=manohar.vanga@gmail.com \
    --cc=martyn.welch@ge.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®