From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vadim Rozenfeld Subject: [PATCH] viostor driver. XP driver performance improvement. Date: Mon, 16 Nov 2009 21:54:57 +0200 Message-ID: <4B01AE11.2000903@redhat.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------000601000707050902030503" To: kvm Return-path: Received: from mx1.redhat.com ([209.132.183.28]:22573 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752877AbZKPTyw (ORCPT ); Mon, 16 Nov 2009 14:54:52 -0500 Received: from int-mx05.intmail.prod.int.phx2.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.18]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id nAGJsxcq012921 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 16 Nov 2009 14:54:59 -0500 Received: from localhost.localdomain (vpn-6-192.tlv.redhat.com [10.35.6.192]) by int-mx05.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id nAGJsvRx018999 for ; Mon, 16 Nov 2009 14:54:58 -0500 Sender: kvm-owner@vger.kernel.org List-ID: This is a multi-part message in MIME format. --------------000601000707050902030503 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit repository: /home/vadimr/shares/kvm-guest-drivers-windows branch: XP commit e58183a0df0fd398e31e3f079b6c301520b2a5a2 Author: Vadim Rozenfeld Date: Sun Nov 15 22:50:55 2009 +0200 [PATCH] viostor driver. XP driver performance improvement. Signed-off-by: Vadim Rozenfeld diff --git a/viostor/virtio_ring.c b/viostor/virtio_ring.c index 2911cef..de69557 100644 --- a/viostor/virtio_ring.c +++ b/viostor/virtio_ring.c @@ -39,7 +39,6 @@ initialize_virtqueue( IN VOID (*notify)(struct virtqueue *)); -//#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq) #define to_vvq(_vq) (struct vring_virtqueue *)_vq static @@ -119,7 +118,7 @@ vring_add_buf( RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("%s: Added buffer head %i to %p\n", __FUNCTION__, head, vq) ); - return 0; + return vq->num_free; } static diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c index 21d27cd..2e61b30 100644 --- a/viostor/virtio_stor_hw_helper.c +++ b/viostor/virtio_stor_hw_helper.c @@ -54,6 +54,8 @@ RhelDoReadWrite(PVOID DeviceExtension, PVOID DataBuffer; PADAPTER_EXTENSION adaptExt; PRHEL_SRB_EXTENSION srbExt; + int num_free; + cdb = (PCDB)&Srb->Cdb[0]; srbExt = (PRHEL_SRB_EXTENSION)Srb->SrbExtension; adaptExt = (PADAPTER_EXTENSION)DeviceExtension; @@ -88,20 +90,21 @@ RhelDoReadWrite(PVOID DeviceExtension, srbExt->vbr.sg[sgElement].physAddr = ScsiPortGetPhysicalAddress(DeviceExtension, NULL,&srbExt->vbr.status,&fragLen); srbExt->vbr.sg[sgElement].ulSize = sizeof(srbExt->vbr.status); - - - if (adaptExt->pci_vq_info.vq->vq_ops->add_buf(adaptExt->pci_vq_info.vq, + num_free = adaptExt->pci_vq_info.vq->vq_ops->add_buf(adaptExt->pci_vq_info.vq, &srbExt->vbr.sg[0], srbExt->out, srbExt->in, -&srbExt->vbr) == 0) { +&srbExt->vbr); + if ( num_free>= 0) { InsertTailList(&adaptExt->list_head,&srbExt->vbr.list_entry); adaptExt->pci_vq_info.vq->vq_ops->kick(adaptExt->pci_vq_info.vq); - if(++adaptExt->requests< adaptExt->queue_depth) { + srbExt->call_next = FALSE; + if(num_free< VIRTIO_MAX_SG) { + srbExt->call_next = TRUE; + } else { ScsiPortNotification(NextLuRequest, DeviceExtension, Srb->PathId, Srb->TargetId, Srb->Lun); } - return TRUE; } - return FALSE; + return TRUE; } #endif --------------000601000707050902030503 Content-Type: text/plain; name="xp_performance.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="xp_performance.patch" diff --git a/viostor/virtio_ring.c b/viostor/virtio_ring.c index 2911cef..de69557 100644 --- a/viostor/virtio_ring.c +++ b/viostor/virtio_ring.c @@ -39,7 +39,6 @@ initialize_virtqueue( IN VOID (*notify)(struct virtqueue *)); -//#define to_vvq(_vq) container_of(_vq, struct vring_virtqueue, vq) #define to_vvq(_vq) (struct vring_virtqueue *)_vq static @@ -119,7 +118,7 @@ vring_add_buf( RhelDbgPrint(TRACE_LEVEL_VERBOSE, ("%s: Added buffer head %i to %p\n", __FUNCTION__, head, vq) ); - return 0; + return vq->num_free; } static diff --git a/viostor/virtio_stor_hw_helper.c b/viostor/virtio_stor_hw_helper.c index 21d27cd..2e61b30 100644 --- a/viostor/virtio_stor_hw_helper.c +++ b/viostor/virtio_stor_hw_helper.c @@ -54,6 +54,8 @@ RhelDoReadWrite(PVOID DeviceExtension, PVOID DataBuffer; PADAPTER_EXTENSION adaptExt; PRHEL_SRB_EXTENSION srbExt; + int num_free; + cdb = (PCDB)&Srb->Cdb[0]; srbExt = (PRHEL_SRB_EXTENSION)Srb->SrbExtension; adaptExt = (PADAPTER_EXTENSION)DeviceExtension; @@ -88,20 +90,21 @@ RhelDoReadWrite(PVOID DeviceExtension, srbExt->vbr.sg[sgElement].physAddr = ScsiPortGetPhysicalAddress(DeviceExtension, NULL, &srbExt->vbr.status, &fragLen); srbExt->vbr.sg[sgElement].ulSize = sizeof(srbExt->vbr.status); - - - if (adaptExt->pci_vq_info.vq->vq_ops->add_buf(adaptExt->pci_vq_info.vq, + num_free = adaptExt->pci_vq_info.vq->vq_ops->add_buf(adaptExt->pci_vq_info.vq, &srbExt->vbr.sg[0], srbExt->out, srbExt->in, - &srbExt->vbr) == 0) { + &srbExt->vbr); + if ( num_free >= 0) { InsertTailList(&adaptExt->list_head, &srbExt->vbr.list_entry); adaptExt->pci_vq_info.vq->vq_ops->kick(adaptExt->pci_vq_info.vq); - if(++adaptExt->requests < adaptExt->queue_depth) { + srbExt->call_next = FALSE; + if(num_free < VIRTIO_MAX_SG) { + srbExt->call_next = TRUE; + } else { ScsiPortNotification(NextLuRequest, DeviceExtension, Srb->PathId, Srb->TargetId, Srb->Lun); } - return TRUE; } - return FALSE; + return TRUE; } #endif --------------000601000707050902030503--