scsiThruputTest.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:7k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* thruputTest.c - Program to obtain throughput of a scsi device (disk,tape) */
  2. /* Copyright 1994-1996 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. Modification History
  6. --------------------
  7. 01b,25sep96,dds  added documentation and corrected for wrs coding standards.
  8. 01a,20may94,jds  written by adapting some basic routines in rawio.c written
  9.                  by ccc
  10. */
  11. #include "vxWorks.h"
  12. #include "tickLib.h"
  13. #include "taskLib.h"
  14. #include "ioLib.h"
  15. #include "memLib.h"
  16. #include "usrLib.h"
  17. #include "fppLib.h"
  18. #include "scsiLib.h"
  19. #include "stdio.h"
  20. #include "string.h"
  21. #define SECTOR_SIZE (512) /* size of a physical sector */
  22. #define MIN_BLOCK_SIZE (0x1000)  /* size of the smallest block */
  23. #define MAX_BLOCK_SIZE (0x100000) /* size of the largest block */
  24. #define FACTOR (0x10) /* factor for incremental block size */
  25. #define TOTAL 0x1000000  /* total bytes to be written */
  26. #define THIS_TASK 0
  27. IMPORT errno;
  28. IMPORT STATUS scsiReadBlockLimits ();
  29. IMPORT STATUS scsiTapeModeSense ();
  30. IMPORT STATUS scsiTapeModeSelect ();
  31. IMPORT STATUS scsiRewind ();
  32. IMPORT STATUS scsiWrtTape ();
  33. IMPORT STATUS scsiRdTape ();
  34. /******************************************************************************
  35. *
  36. * validateParameterString - parse the paramater string
  37. *
  38. * This routine parses the parmater string and checks the validity of
  39. * each parameter.
  40. *
  41. * RETURNS: OK if passes, or ERROR if an error is encountered.
  42. */
  43. STATUS validateParameterString 
  44.     (
  45.     char * paramString,
  46.     int  * scsiBusId,             /* scsi id of the device */
  47.     int  * devLun,                /* lun id of the device  */
  48.     int  * numBlocks,             /* no. of blocks in block device */
  49.     int  * blkOffset              /* address of first block in volume */
  50.     )
  51.     {
  52.     sscanf (paramString, "%d %d %x %x", scsiBusId, devLun, numBlocks,
  53.     blkOffset);
  54.     if ((*scsiBusId < 0) || (*scsiBusId > 7))
  55.        {
  56.        printf ("Invalid SCSI BUS ID: Range [0..7]n");
  57.        return (ERROR);
  58.        }
  59.     if ((*devLun < 0) || (*devLun > 7))
  60.        {
  61.        printf ("Invalid Logical Unitn");
  62.        return (ERROR);
  63.        }  
  64.     if (*numBlocks < 0)
  65.        {
  66.        printf ("Innvalid Number of blocksn");
  67.        return (ERROR);
  68.        }
  69.     if (*blkOffset < 0)
  70.        {
  71.        printf ("Innvalid block addressn");
  72.        return (ERROR);
  73.        }
  74.     else
  75.       return (OK);
  76.     }
  77. /******************************************************************************
  78. *
  79. * DESCRIPTION:
  80. * This test partions a 16 Mbyte block device into sectors of sizes 4096,
  81. * 65536 or 1048576. Sectors consists of blocks of 512 Mbytes. This test
  82. * writes and reads to the disk devive and calculates the time.
  83. */
  84. STATUS scsiDiskThruputTest
  85.     (
  86.     char * paramString
  87.     )
  88.     {
  89.     char *buffer;
  90.     UINT count;
  91.     UINT blkSize;
  92.     STATUS status = OK;
  93.     ULONG start_tick,stop_tick;
  94.     double time,ttime;
  95.     int blockNumber;
  96.     int numSects;
  97.     int numWrites;
  98.     int t=1;
  99.     int scsiBusId;              /* scsi id of the device */
  100.     int devLun;                 /* lun id of the device  */
  101.     int numBlocks;              /* no. of blocks in block device */
  102.     int blkOffset;              /* address of first blcok in volume */
  103.     SCSI_PHYS_DEV *pPhysDev;
  104.     SCSI_BLK_DEV *pBlkDev;
  105.     if (paramString == NULL)
  106.         {
  107.  printf ("Usage: n");
  108.  printf ("Example -> scsiDiskThruputTest "4 0 0x0000 0x0000"n");
  109.  printf ( "      "n");
  110.  printf ("       1. scsiBusId   :  <Target device ID>n");
  111.  printf ("       2. devLun      :  <Device Logical Unit ID>n");       
  112.  printf ("       3. numBlocks   :  <no. of blocks in block device>n");
  113.  printf ("       4. blkOffset   :  <adrs of first block in volume>n");
  114.  printf ( "      "n");
  115.  return (ERROR);
  116.          }
  117.     if (validateParameterString (paramString,  &scsiBusId, &devLun, &numBlocks,
  118.  &blkOffset) == ERROR)
  119.       return (ERROR);
  120.     /* create physical SCSI device */
  121.     if ((pPhysDev=scsiPhysDevIdGet(0,scsiBusId,devLun))==(SCSI_PHYS_DEV *)NULL)
  122.         if ((pPhysDev=scsiPhysDevCreate(pSysScsiCtrl,scsiBusId,devLun,0,
  123. NONE,0,0,0)) == (SCSI_PHYS_DEV *) NULL)
  124.             {
  125.             printf ("pkTestOneUnit: scsiPhysDevCreate() failedn");
  126.             return (ERROR);
  127.             }
  128.     /* create logical SCSI device */
  129.     if ((pBlkDev = (SCSI_BLK_DEV *) scsiBlkDevCreate (pPhysDev, 0, 0)) == NULL)
  130.         {
  131.         printf ("pkTestOneUnit: scsiBlkDevCreate() failedn");
  132.         return (ERROR);
  133.         }
  134.     
  135.     printf ("nnDisk write/read speed testn");
  136.     printf ("Total: %u bytesnn",TOTAL);
  137.     
  138.     for (blkSize = MIN_BLOCK_SIZE; blkSize <= MAX_BLOCK_SIZE; 
  139.  blkSize *= FACTOR)
  140. {
  141.         printf("Loop %d:n",t);
  142. t++;
  143. buffer = (char *) malloc (blkSize);
  144.         if (buffer == NULL)
  145.          {
  146.     printErrno (errno);
  147.     printf ("fileio: Error in allocating spacen");
  148.     return (ERROR);
  149.     }
  150.         bzero (buffer, blkSize);
  151.         taskPrioritySet (THIS_TASK, 10);
  152.         printf ("Starting to run WRITE speed test for block size %dn",
  153. blkSize);
  154.         blockNumber = 0;
  155.         numSects = blkSize / SECTOR_SIZE;
  156.         numWrites = TOTAL / blkSize;
  157. start_tick = tickGet();
  158.         
  159. printf("Writing %d times, total of %d sectorsn", 
  160.        numSects, numWrites);
  161. for (count = 0; count < numWrites; count++)
  162.     {
  163.     status = scsiWrtSecs (pBlkDev, blockNumber, numSects, buffer);
  164.     blockNumber += numSects;
  165.     if (status == ERROR)
  166.         {
  167.         printErrno (errno);
  168.         printf ("fileio: Error in writing to diskn");
  169.         free (buffer);
  170.         return (ERROR);
  171.         }
  172.     }
  173. printf("Block Number is %dn", blockNumber);
  174.         stop_tick = tickGet();
  175.         time = ((double) (stop_tick - start_tick)) / 60.0;
  176.         ttime = (double) TOTAL / (time * 1024.0 * 1024.0);
  177.         printf ("Write Run time: %4.2f sec. Transfer rate: %4.3f MB/sec.n", 
  178. time, ttime);
  179.         printf ("Starting to run READ  speed test for block size %dn",
  180. blkSize);
  181.         blockNumber = 100;
  182.         start_tick = tickGet();
  183. printf("Reading %d times, total of %d sectorsn", 
  184.                numSects, numWrites);
  185.         for (count = 0; count < numWrites; count++)
  186.             {
  187.             status = scsiRdSecs (pBlkDev, blockNumber, numSects, buffer);
  188.             if (status == ERROR)
  189.                 {
  190.                 printErrno (errno);
  191.                 printf ("fileio: Error in reading diskn");
  192.                 free (buffer);
  193.                 return (ERROR);
  194.                 }
  195.             }
  196.         stop_tick = tickGet();
  197.         time = ((double) (stop_tick - start_tick)) / 60.0;
  198.         ttime = (double) TOTAL / (time * 1024.0 * 1024.0);
  199.         printf ("Read Run time: %4.2f sec. Transfer rate: %4.3f MB/sec.nn",
  200. time, ttime);
  201.         free (buffer);
  202. }
  203.     scsiPhysDevDelete (pPhysDev);
  204.     printf("rawTapeThruput test completed.n");
  205.     return (OK);
  206.     }