Skip to content

Commit

Permalink
uml: send pointers instead of structures to I/O thread
Browse files Browse the repository at this point in the history
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 <jdike@linux.intel.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Jeff Dike authored and Linus Torvalds committed May 7, 2007
1 parent a0044bd commit 2adcec2
Showing 1 changed file with 26 additions and 15 deletions.
41 changes: 26 additions & 15 deletions arch/um/drivers/ubd_kern.c
Original file line number Diff line number Diff line change
Expand Up @@ -503,15 +503,16 @@ 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;
unsigned long flags;
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;
Expand All @@ -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);

Expand Down Expand Up @@ -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;

Expand All @@ -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);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down

0 comments on commit 2adcec2

Please sign in to comment.