performance with a generic block device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



   I have question about performance on a generic block device
 that I have written.  It's very simple device. All the block device does
 is register a make_request function in addtion to the normal
  blkdev operations.   

   When a buffer header is received in make_request function it maps the
   buffer header to a new device by changing it's b_rdev to the
   new device number.  The make request function then returns 
   1 allowing the kernel to send the buffer header to the correct
   device. 

    Everthing seems to work fine as long as I working with one  minor
   number.   For instance,   redirecting buffer_headers that are for
    my device say with major 212 and minor 0   to scsi device /dev/sda1.
    It works great I get the same read and write performance as if I
    was writting directly to /dev/sda1.

    When I try doing 2 IO streams lets say from  major 212 minor 0 to
    scsi device /dev/sda1 and major 212 and minor 1 to scsi device 
     /dev/sdb1.   The read and write performance is half of what 
     it was when I was reading and writting to one device.  In
    other words the buffer headers seem to be getting serialized
     thru my device.

    When I try doing 2 IO streams directly to /dev/sda1 and /dev/sdb1
    the aggergate banwidth of both IO streams is double of what it was
    when doing the same test to one device.  This is how I would expect
    my generic block device to act. 

     I have included my make request function.

int
test_make_request( request_queue_t * queue, int rw ,  struct buffer_head *bh )
{

    kdev_t rdev = 0;

    
    #if CONFIG_HIGHMEM

           bh = create_bounce(rw,bh);

    #endif	    


    /* Map to new device using map array */
    /* the map array contains the read device number */
     rdev =   map[MINOR( bh->b_rdev ) ] ;
    
     if ( rdev == 0 )
     {
        PERR(" Did not find correct device ");
    	buffer_IO_error(bh);
	return 0;
     }

    /*   redirect buffer header to new device */
     bh->b_rdev = rdev ;
  
    /*   request  buffer header be sent to new device */
    return 1;

}  

     thats it.   I'm not holding any locks and I'm not sleeping I do not
   understand why the performance for this block device is so poor.  

     Is there possibly something else that needs to be done at time
     of calling register_blkdev?  Do I need to register a gendisk 
     structure?  

    Thank You
    don jessup
    donjay72@yahoo.com


=====
Don Jessup
Asaca/Shibasoku Corp. of America
400 Corporate Circle, Unit G
Golden, CO  80401
303-278-1111 X232
donj@asaca.com
http://www.asaca.com
--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/



[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux