trans_virtio.c (f26e8817b235d8764363bffcc9cbfc61867371f2) | trans_virtio.c (9523feac272ccad2ad8186ba4fcc89103754de52) |
---|---|
1/* 2 * The Virtio 9p transport driver 3 * 4 * This is a block based transport driver based on the lguest block driver 5 * code. 6 * 7 * Copyright (C) 2007, 2008 Eric Van Hensbergen, IBM Corporation 8 * --- 272 unchanged lines hidden (view full) --- 281 sgs[out_sgs + in_sgs++] = chan->sg + out; 282 283 err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req, 284 GFP_ATOMIC); 285 if (err < 0) { 286 if (err == -ENOSPC) { 287 chan->ring_bufs_avail = 0; 288 spin_unlock_irqrestore(&chan->lock, flags); | 1/* 2 * The Virtio 9p transport driver 3 * 4 * This is a block based transport driver based on the lguest block driver 5 * code. 6 * 7 * Copyright (C) 2007, 2008 Eric Van Hensbergen, IBM Corporation 8 * --- 272 unchanged lines hidden (view full) --- 281 sgs[out_sgs + in_sgs++] = chan->sg + out; 282 283 err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req, 284 GFP_ATOMIC); 285 if (err < 0) { 286 if (err == -ENOSPC) { 287 chan->ring_bufs_avail = 0; 288 spin_unlock_irqrestore(&chan->lock, flags); |
289 err = wait_event_interruptible(*chan->vc_wq, 290 chan->ring_bufs_avail); | 289 err = wait_event_killable(*chan->vc_wq, 290 chan->ring_bufs_avail); |
291 if (err == -ERESTARTSYS) 292 return err; 293 294 p9_debug(P9_DEBUG_TRANS, "Retry virtio request\n"); 295 goto req_retry; 296 } else { 297 spin_unlock_irqrestore(&chan->lock, flags); 298 p9_debug(P9_DEBUG_TRANS, --- 23 unchanged lines hidden (view full) --- 322 323 if (!(data->type & ITER_KVEC)) { 324 int n; 325 /* 326 * We allow only p9_max_pages pinned. We wait for the 327 * Other zc request to finish here 328 */ 329 if (atomic_read(&vp_pinned) >= chan->p9_max_pages) { | 291 if (err == -ERESTARTSYS) 292 return err; 293 294 p9_debug(P9_DEBUG_TRANS, "Retry virtio request\n"); 295 goto req_retry; 296 } else { 297 spin_unlock_irqrestore(&chan->lock, flags); 298 p9_debug(P9_DEBUG_TRANS, --- 23 unchanged lines hidden (view full) --- 322 323 if (!(data->type & ITER_KVEC)) { 324 int n; 325 /* 326 * We allow only p9_max_pages pinned. We wait for the 327 * Other zc request to finish here 328 */ 329 if (atomic_read(&vp_pinned) >= chan->p9_max_pages) { |
330 err = wait_event_interruptible(vp_wq, | 330 err = wait_event_killable(vp_wq, |
331 (atomic_read(&vp_pinned) < chan->p9_max_pages)); 332 if (err == -ERESTARTSYS) 333 return err; 334 } 335 n = iov_iter_get_pages_alloc(data, pages, count, offs); 336 if (n < 0) 337 return n; 338 *need_drop = 1; --- 127 unchanged lines hidden (view full) --- 466 467 BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs)); 468 err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req, 469 GFP_ATOMIC); 470 if (err < 0) { 471 if (err == -ENOSPC) { 472 chan->ring_bufs_avail = 0; 473 spin_unlock_irqrestore(&chan->lock, flags); | 331 (atomic_read(&vp_pinned) < chan->p9_max_pages)); 332 if (err == -ERESTARTSYS) 333 return err; 334 } 335 n = iov_iter_get_pages_alloc(data, pages, count, offs); 336 if (n < 0) 337 return n; 338 *need_drop = 1; --- 127 unchanged lines hidden (view full) --- 466 467 BUG_ON(out_sgs + in_sgs > ARRAY_SIZE(sgs)); 468 err = virtqueue_add_sgs(chan->vq, sgs, out_sgs, in_sgs, req, 469 GFP_ATOMIC); 470 if (err < 0) { 471 if (err == -ENOSPC) { 472 chan->ring_bufs_avail = 0; 473 spin_unlock_irqrestore(&chan->lock, flags); |
474 err = wait_event_interruptible(*chan->vc_wq, 475 chan->ring_bufs_avail); | 474 err = wait_event_killable(*chan->vc_wq, 475 chan->ring_bufs_avail); |
476 if (err == -ERESTARTSYS) 477 goto err_out; 478 479 p9_debug(P9_DEBUG_TRANS, "Retry virtio request\n"); 480 goto req_retry_pinned; 481 } else { 482 spin_unlock_irqrestore(&chan->lock, flags); 483 p9_debug(P9_DEBUG_TRANS, 484 "virtio rpc add_sgs returned failure\n"); 485 err = -EIO; 486 goto err_out; 487 } 488 } 489 virtqueue_kick(chan->vq); 490 spin_unlock_irqrestore(&chan->lock, flags); 491 p9_debug(P9_DEBUG_TRANS, "virtio request kicked\n"); | 476 if (err == -ERESTARTSYS) 477 goto err_out; 478 479 p9_debug(P9_DEBUG_TRANS, "Retry virtio request\n"); 480 goto req_retry_pinned; 481 } else { 482 spin_unlock_irqrestore(&chan->lock, flags); 483 p9_debug(P9_DEBUG_TRANS, 484 "virtio rpc add_sgs returned failure\n"); 485 err = -EIO; 486 goto err_out; 487 } 488 } 489 virtqueue_kick(chan->vq); 490 spin_unlock_irqrestore(&chan->lock, flags); 491 p9_debug(P9_DEBUG_TRANS, "virtio request kicked\n"); |
492 err = wait_event_interruptible(*req->wq, 493 req->status >= REQ_STATUS_RCVD); | 492 err = wait_event_killable(*req->wq, req->status >= REQ_STATUS_RCVD); |
494 /* 495 * Non kernel buffers are pinned, unpin them 496 */ 497err_out: 498 if (need_drop) { 499 if (in_pages) { 500 p9_release_pages(in_pages, in_nr_pages); 501 atomic_sub(in_nr_pages, &vp_pinned); --- 272 unchanged lines hidden --- | 493 /* 494 * Non kernel buffers are pinned, unpin them 495 */ 496err_out: 497 if (need_drop) { 498 if (in_pages) { 499 p9_release_pages(in_pages, in_nr_pages); 500 atomic_sub(in_nr_pages, &vp_pinned); --- 272 unchanged lines hidden --- |