Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2adcec2197897365e0a0f657f1098cbfdb44bc8b
Commit:     2adcec2197897365e0a0f657f1098cbfdb44bc8b
Parent:     a0044bdf60c212366a314da09ca624cb315906e2
Author:     Jeff Dike <[EMAIL PROTECTED]>
AuthorDate: Sun May 6 14:51:37 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Mon May 7 12:13:03 2007 -0700

    uml: send pointers instead of structures to I/O thread
    
    Instead of writing entire structures between UML and the I/O thread, we send
    pointers.  This cuts down on the amount of data being copied and possibly
    allows more requests to be pending between the two.
    
    This requires that the requests be kmalloced and freed instead of living on
    the stack.
    
    Signed-off-by: Jeff Dike <[EMAIL PROTECTED]>
    Cc: Paolo 'Blaisorblade' Giarrusso <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 arch/um/drivers/ubd_kern.c |   41 ++++++++++++++++++++++++++---------------
 1 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c
index 5ef47b7..9200a45 100644
--- a/arch/um/drivers/ubd_kern.c
+++ b/arch/um/drivers/ubd_kern.c
@@ -503,7 +503,7 @@ static LIST_HEAD(restart);
 /* Called without dev->lock held, and only in interrupt context. */
 static void ubd_handler(void)
 {
-       struct io_thread_req req;
+       struct io_thread_req *req;
        struct request *rq;
        struct ubd *ubd;
        struct list_head *list, *next_ele;
@@ -511,7 +511,8 @@ static void ubd_handler(void)
        int n;
 
        while(1){
-               n = os_read_file_k(thread_fd, &req, sizeof(req));
+               n = os_read_file_k(thread_fd, &req,
+                                  sizeof(struct io_thread_req *));
                if(n != sizeof(req)){
                        if(n == -EAGAIN)
                                break;
@@ -520,10 +521,11 @@ static void ubd_handler(void)
                        return;
                }
 
-               rq = req.req;
-               rq->nr_sectors -= req.length >> 9;
+               rq = req->req;
+               rq->nr_sectors -= req->length >> 9;
                if(rq->nr_sectors == 0)
                        ubd_finish(rq, rq->hard_nr_sectors << 9);
+               kfree(req);
        }
        reactivate_fd(thread_fd, UBD_IRQ);
 
@@ -1078,7 +1080,7 @@ static void prepare_request(struct request *req, struct 
io_thread_req *io_req,
 /* Called with dev->lock held */
 static void do_ubd_request(request_queue_t *q)
 {
-       struct io_thread_req io_req;
+       struct io_thread_req *io_req;
        struct request *req;
        int n;
 
@@ -1099,13 +1101,20 @@ static void do_ubd_request(request_queue_t *q)
                while(dev->start_sg < dev->end_sg){
                        struct scatterlist *sg = &dev->sg[dev->start_sg];
 
-                       prepare_request(req, &io_req,
+                       io_req = kmalloc(sizeof(struct io_thread_req),
+                                        GFP_KERNEL | GFP_ATOMIC);
+                       if(io_req == NULL){
+                               if(list_empty(&dev->restart))
+                                       list_add(&dev->restart, &restart);
+                               return;
+                       }
+                       prepare_request(req, io_req,
                                        (unsigned long long) req->sector << 9,
                                        sg->offset, sg->length, sg->page);
 
-                       n = os_write_file_k(thread_fd, (char *) &io_req,
-                                           sizeof(io_req));
-                       if(n != sizeof(io_req)){
+                       n = os_write_file_k(thread_fd, &io_req,
+                                           sizeof(struct io_thread_req *));
+                       if(n != sizeof(struct io_thread_req *)){
                                if(n != -EAGAIN)
                                        printk("write to io thread failed, "
                                               "errno = %d\n", -n);
@@ -1437,13 +1446,14 @@ static int io_count = 0;
 
 int io_thread(void *arg)
 {
-       struct io_thread_req req;
+       struct io_thread_req *req;
        int n;
 
        ignore_sigwinch_sig();
        while(1){
-               n = os_read_file_k(kernel_fd, &req, sizeof(req));
-               if(n != sizeof(req)){
+               n = os_read_file_k(kernel_fd, &req,
+                                sizeof(struct io_thread_req *));
+               if(n != sizeof(struct io_thread_req *)){
                        if(n < 0)
                                printk("io_thread - read failed, fd = %d, "
                                       "err = %d\n", kernel_fd, -n);
@@ -1454,9 +1464,10 @@ int io_thread(void *arg)
                        continue;
                }
                io_count++;
-               do_io(&req);
-               n = os_write_file_k(kernel_fd, &req, sizeof(req));
-               if(n != sizeof(req))
+               do_io(req);
+               n = os_write_file_k(kernel_fd, &req,
+                                 sizeof(struct io_thread_req *));
+               if(n != sizeof(struct io_thread_req *))
                        printk("io_thread - write failed, fd = %d, err = %d\n",
                               kernel_fd, -n);
        }
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to