msg->perm);
 }
 
-static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev,
+static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
                                        struct vhost_iotlb_msg *msg)
 {
        struct vhost_vdpa *v = container_of(dev, struct vhost_vdpa, vdev);
        struct vhost_iotlb *iotlb = v->iotlb;
        int r = 0;
 
+       if (asid != 0)
+               return -EINVAL;
+
        mutex_lock(&dev->mutex);
 
        r = vhost_dev_check_owner(dev);
 
                    struct vhost_virtqueue **vqs, int nvqs,
                    int iov_limit, int weight, int byte_weight,
                    bool use_worker,
-                   int (*msg_handler)(struct vhost_dev *dev,
+                   int (*msg_handler)(struct vhost_dev *dev, u32 asid,
                                       struct vhost_iotlb_msg *msg))
 {
        struct vhost_virtqueue *vq;
        return true;
 }
 
-static int vhost_process_iotlb_msg(struct vhost_dev *dev,
+static int vhost_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
                                   struct vhost_iotlb_msg *msg)
 {
        int ret = 0;
 
+       if (asid != 0)
+               return -EINVAL;
+
        mutex_lock(&dev->mutex);
        vhost_dev_lock_vqs(dev);
        switch (msg->type) {
        struct vhost_iotlb_msg msg;
        size_t offset;
        int type, ret;
+       u32 asid = 0;
 
        ret = copy_from_iter(&type, sizeof(type), from);
        if (ret != sizeof(type)) {
                offset = offsetof(struct vhost_msg, iotlb) - sizeof(int);
                break;
        case VHOST_IOTLB_MSG_V2:
-               offset = sizeof(__u32);
+               if (vhost_backend_has_feature(dev->vqs[0],
+                                             VHOST_BACKEND_F_IOTLB_ASID)) {
+                       ret = copy_from_iter(&asid, sizeof(asid), from);
+                       if (ret != sizeof(asid)) {
+                               ret = -EINVAL;
+                               goto done;
+                       }
+                       offset = sizeof(__u16);
+               } else
+                       offset = sizeof(__u32);
                break;
        default:
                ret = -EINVAL;
        }
 
        if (dev->msg_handler)
-               ret = dev->msg_handler(dev, &msg);
+               ret = dev->msg_handler(dev, asid, &msg);
        else
-               ret = vhost_process_iotlb_msg(dev, &msg);
+               ret = vhost_process_iotlb_msg(dev, asid, &msg);
        if (ret) {
                ret = -EFAULT;
                goto done;
 
        int byte_weight;
        u64 kcov_handle;
        bool use_worker;
-       int (*msg_handler)(struct vhost_dev *dev,
+       int (*msg_handler)(struct vhost_dev *dev, u32 asid,
                           struct vhost_iotlb_msg *msg);
 };
 
 void vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs,
                    int nvqs, int iov_limit, int weight, int byte_weight,
                    bool use_worker,
-                   int (*msg_handler)(struct vhost_dev *dev,
+                   int (*msg_handler)(struct vhost_dev *dev, u32 asid,
                                       struct vhost_iotlb_msg *msg));
 long vhost_dev_set_owner(struct vhost_dev *dev);
 bool vhost_dev_has_owner(struct vhost_dev *dev);
 
 
 struct vhost_msg_v2 {
        __u32 type;
-       __u32 reserved;
+       __u32 asid;
        union {
                struct vhost_iotlb_msg iotlb;
                __u8 padding[64];
 #define VHOST_BACKEND_F_IOTLB_MSG_V2 0x1
 /* IOTLB can accept batching hints */
 #define VHOST_BACKEND_F_IOTLB_BATCH  0x2
+/* IOTLB can accept address space identifier through V2 type of IOTLB
+ * message
+ */
+#define VHOST_BACKEND_F_IOTLB_ASID  0x3
 
 #endif