diff mbox

tcm_vhost: Use ACCESS_ONCE for vs->vs_tpg[target] access

Message ID 1364916697-13212-1-git-send-email-asias@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Asias He April 2, 2013, 3:31 p.m. UTC
In vhost_scsi_handle_vq:

      tv_tpg = vs->vs_tpg[target];
      if (!tv_tpg) {
              ....
              return
      }

      tv_cmd = vhost_scsi_allocate_cmd(tv_tpg, &v_req,

1) vs->vs_tpg[target] might change after the NULL check and 2) the above
line might access tv_tpg from vs->vs_tpg[target]. To prevent 2), use
ACCESS_ONCE. Thanks mst for catching this up!

Signed-off-by: Asias He <asias@redhat.com>
---
 drivers/vhost/tcm_vhost.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Michael S. Tsirkin April 2, 2013, 3:39 p.m. UTC | #1
On Tue, Apr 02, 2013 at 11:31:37PM +0800, Asias He wrote:
> In vhost_scsi_handle_vq:
> 
>       tv_tpg = vs->vs_tpg[target];
>       if (!tv_tpg) {
>               ....
>               return
>       }
> 
>       tv_cmd = vhost_scsi_allocate_cmd(tv_tpg, &v_req,
> 
> 1) vs->vs_tpg[target] might change after the NULL check and 2) the above
> line might access tv_tpg from vs->vs_tpg[target]. To prevent 2), use
> ACCESS_ONCE. Thanks mst for catching this up!
> 
> Signed-off-by: Asias He <asias@redhat.com>

OK this might be ok for 3.9.

Acked-by: Michael S. Tsirkin <mst@redhat.com>

Nicholas can you pick this up pls?

For 3.10 I still think it's best to get rid of it
and stick vs->vs_tpg in vq->private_data.

> ---
>  drivers/vhost/tcm_vhost.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/vhost/tcm_vhost.c b/drivers/vhost/tcm_vhost.c
> index 0524267..32d95e3 100644
> --- a/drivers/vhost/tcm_vhost.c
> +++ b/drivers/vhost/tcm_vhost.c
> @@ -668,7 +668,7 @@ static void vhost_scsi_handle_vq(struct vhost_scsi *vs,
>  
>  		/* Extract the tpgt */
>  		target = v_req.lun[1];
> -		tv_tpg = vs->vs_tpg[target];
> +		tv_tpg = ACCESS_ONCE(vs->vs_tpg[target]);
>  
>  		/* Target does not exist, fail the request */
>  		if (unlikely(!tv_tpg)) {
> -- 
> 1.8.1.4
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Nicholas A. Bellinger April 2, 2013, 11:42 p.m. UTC | #2
On Tue, 2013-04-02 at 18:39 +0300, Michael S. Tsirkin wrote:
> On Tue, Apr 02, 2013 at 11:31:37PM +0800, Asias He wrote:
> > In vhost_scsi_handle_vq:
> > 
> >       tv_tpg = vs->vs_tpg[target];
> >       if (!tv_tpg) {
> >               ....
> >               return
> >       }
> > 
> >       tv_cmd = vhost_scsi_allocate_cmd(tv_tpg, &v_req,
> > 
> > 1) vs->vs_tpg[target] might change after the NULL check and 2) the above
> > line might access tv_tpg from vs->vs_tpg[target]. To prevent 2), use
> > ACCESS_ONCE. Thanks mst for catching this up!
> > 
> > Signed-off-by: Asias He <asias@redhat.com>
> 
> OK this might be ok for 3.9.
> 
> Acked-by: Michael S. Tsirkin <mst@redhat.com>
> 
> Nicholas can you pick this up pls?
> 

Applying to target-pending/master now.

> For 3.10 I still think it's best to get rid of it
> and stick vs->vs_tpg in vq->private_data.
> 

Your call here.  Given that vhost-scsi-pci code + Seabios w/ virtio-scsi
enabled will be broken without Asias's two extra vq->private_data and
initialize vq->last_used_idx changes on the list, they will certainly
need to hit 3.9.x code once your happy to ACK for v3.10.

Asias, I assume you'll be updating this soon..?

--nab

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/vhost/tcm_vhost.c b/drivers/vhost/tcm_vhost.c
index 0524267..32d95e3 100644
--- a/drivers/vhost/tcm_vhost.c
+++ b/drivers/vhost/tcm_vhost.c
@@ -668,7 +668,7 @@  static void vhost_scsi_handle_vq(struct vhost_scsi *vs,
 
 		/* Extract the tpgt */
 		target = v_req.lun[1];
-		tv_tpg = vs->vs_tpg[target];
+		tv_tpg = ACCESS_ONCE(vs->vs_tpg[target]);
 
 		/* Target does not exist, fail the request */
 		if (unlikely(!tv_tpg)) {