Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a01a9840 authored by Venkateswararao Jujjuri (JV)'s avatar Venkateswararao Jujjuri (JV) Committed by Eric Van Hensbergen
Browse files

[net/9p] Set the condition just before waking up.



Given that the sprious wake-ups are common, we need to move the
condition setting right next to the wake_up().  After setting the condition
to req->status = REQ_STATUS_RCVD, sprious wakeups may cause the
virtqueue back on the free list for someone else to use.
This may result in kernel panic while relasing the pinned pages
in p9_release_req_pages().

Also rearranged the while loop in req_done() for better redability.

Signed-off-by: default avatarVenkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Signed-off-by: default avatarEric Van Hensbergen <ericvh@gmail.com>
parent 53bda3e5
Loading
Loading
Loading
Loading
+22 −22
Original line number Diff line number Diff line
@@ -141,20 +141,22 @@ static void req_done(struct virtqueue *vq)

	P9_DPRINTK(P9_DEBUG_TRANS, ": request done\n");

	do {
	while (1) {
		spin_lock_irqsave(&chan->lock, flags);
		rc = virtqueue_get_buf(chan->vq, &len);

		if (rc != NULL) {
		if (rc == NULL) {
			spin_unlock_irqrestore(&chan->lock, flags);
			break;
		}

		chan->ring_bufs_avail = 1;
		spin_unlock_irqrestore(&chan->lock, flags);
		/* Wakeup if anyone waiting for VirtIO ring space. */
		wake_up(chan->vc_wq);
		P9_DPRINTK(P9_DEBUG_TRANS, ": rc %p\n", rc);
			P9_DPRINTK(P9_DEBUG_TRANS, ": lookup tag %d\n",
					rc->tag);
		P9_DPRINTK(P9_DEBUG_TRANS, ": lookup tag %d\n", rc->tag);
		req = p9_tag_lookup(chan->client, rc->tag);
			req->status = REQ_STATUS_RCVD;
		if (req->tc->private) {
			struct trans_rpage_info *rp = req->tc->private;
			/*Release pages */
@@ -163,11 +165,9 @@ static void req_done(struct virtqueue *vq)
				kfree(rp);
			req->tc->private = NULL;
		}
		req->status = REQ_STATUS_RCVD;
		p9_client_cb(chan->client, req);
		} else {
			spin_unlock_irqrestore(&chan->lock, flags);
	}
	} while (rc != NULL);
}

/**