[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [linux-2.6.18-xen] usbback: don't access request fields in shared ring more than once


  • To: xen-changelog@xxxxxxxxxxxxxxxxxxx
  • From: Xen patchbot-linux-2.6.18-xen <patchbot@xxxxxxx>
  • Date: Mon, 06 Oct 2014 09:11:02 +0000
  • Delivery-date: Mon, 06 Oct 2014 09:11:13 +0000
  • List-id: "Change log for Mercurial \(receive only\)" <xen-changelog.lists.xen.org>

# HG changeset patch
# User Jan Beulich <jbeulich@xxxxxxxx>
# Date 1412586418 -7200
# Node ID 809680069660b199d48fc9e235cfdefdcf391ca7
# Parent  ab22257ffed27a8700322f1a185a399dca909c59
usbback: don't access request fields in shared ring more than once

... as being unsafe (prone to the fields changing under our feet). Now
that we copy the request, undo 1264:ab22257ffed2 ("usbback: mark
request as consumed after finished using it") at once.

For the usbbk_hotplug_notify() case adjust the code slightly too
despite there not being explicit issues - just make obvious that there
are no multiple field accesses here by not even using an intermediate
variable.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---


diff -r ab22257ffed2 -r 809680069660 drivers/xen/usbback/usbback.c
--- a/drivers/xen/usbback/usbback.c     Fri Sep 26 12:04:11 2014 +0200
+++ b/drivers/xen/usbback/usbback.c     Mon Oct 06 11:06:58 2014 +0200
@@ -970,7 +970,6 @@ fail_response:
 static int usbbk_start_submit_urb(usbif_t *usbif)
 {
        usbif_urb_back_ring_t *urb_ring = &usbif->urb_ring;
-       usbif_urb_request_t *req;
        pending_req_t *pending_req;
        RING_IDX rc, rp;
        int more_to_do = 0;
@@ -989,6 +988,8 @@ static int usbbk_start_submit_urb(usbif_
        }
 
        while (rc != rp) {
+               usbif_urb_request_t req;
+
                if (RING_REQUEST_CONS_OVERFLOW(urb_ring, rc)) {
                        if(printk_ratelimit())
                                printk(KERN_WARNING "usbback: "
@@ -1002,11 +1003,11 @@ static int usbbk_start_submit_urb(usbif_
                        break;
                }
 
-               req = RING_GET_REQUEST(urb_ring, rc);
+               req = *RING_GET_REQUEST(urb_ring, rc);
+               urb_ring->req_cons = ++rc;
+               barrier();
 
-               dispatch_request_to_pending_reqs(usbif, req,
-                                                       pending_req);
-               urb_ring->req_cons = ++rc;
+               dispatch_request_to_pending_reqs(usbif, &req, pending_req);
 
                cond_resched();
        }
@@ -1019,7 +1020,6 @@ static int usbbk_start_submit_urb(usbif_
 void usbbk_hotplug_notify(usbif_t *usbif, int portnum, int speed)
 {
        usbif_conn_back_ring_t *ring = &usbif->conn_ring;
-       usbif_conn_request_t *req;
        usbif_conn_response_t *res;
        unsigned long flags;
        u16 id;
@@ -1027,8 +1027,7 @@ void usbbk_hotplug_notify(usbif_t *usbif
 
        spin_lock_irqsave(&usbif->conn_ring_lock, flags);
 
-       req = RING_GET_REQUEST(ring, ring->req_cons);;
-       id = req->id;
+       id = RING_GET_REQUEST(ring, ring->req_cons)->id;
        ring->req_cons++;
        ring->sring->req_event = ring->req_cons + 1;
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.