linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mike Anderson <andmike@linux.vnet.ibm.com>
To: Matthew Wilcox <matthew@wil.cx>
Cc: linux-scsi@vger.kernel.org
Subject: Re: [DO NOT APPLY] sd take advantage of rotation speed
Date: Thu, 19 Jun 2008 10:12:58 -0700	[thread overview]
Message-ID: <20080619171258.GA819@linux.vnet.ibm.com> (raw)
In-Reply-To: <20080619160342.GJ4392@parisc-linux.org>

Matthew Wilcox <matthew@wil.cx> wrote:
> Use the noop elevator by default for drives that do not spin
> 
> [Not for applying]
> 
> SSDs do not benefit from the elevator.  It just wastes precious CPU cycles.
> By selecting the noop elevator by default, we can shave a few microseconds
> off each IO.
> 
> I've brazenly stolen sd_vpd_inquiry from mkp's patch here:
> 
> http://marc.info/?l=linux-scsi&m=121264354724277&w=2
> 
> No need to have two copies of that ... but this will conflict with his code.
> 

Why would we want to do this in the kernel instead of a udev rule
similar to how we set timeouts. Since there already exists a sysfs
interface to change the IO scheduler it would seem this would be more
flexible in case someone did not like the kernel policy selected.

You would need some tool to obtain the vpd data from user space that would
always be installed.

There was some past discussion on replacing scsi_id with a better tool
to support more options. url provided below.
http://thread.gmane.org/gmane.linux.kernel.device-mapper.devel/5289/focus=5301

> On to the self-criticism:
> 
> I don't intend the final version of this patch to include a printk for
> the RPM or even a printk to say we switched IO elevator.  I think we're
> too verbose in SCSI as it is.
> 
> I think there's an opportunity to improve sd_vpd_inquiry() to remove
> some of the duplicate code between sd_set_elevator() and sd_block_limits,
> but it's not terribly important.
> 
> The switching of the elevators isn't particularly nice.  I assume that
> elevator_init("noop") cannot fail, which isn't true.  It would be nice
> to use the #if 0 block instead, but that causes a null ptr dereference
> inside sysfs -- I suspect something isn't set up correctly.
> 
> Not-signed-off-by: Matthew Wilcox <willy@linux.intel.com>
> 
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index 01cefbb..1c5a296 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -1534,6 +1534,79 @@ defaults:
>  	sdkp->DPOFUA = 0;
>  }
> 
> +static int sd_vpd_inquiry(struct scsi_disk *sdkp, unsigned char *buffer, u8 page, u8 len)
> +{
> +	int result;
> +	unsigned char cmd[16];
> +	struct scsi_sense_hdr sshdr;
> +
> +	memset(cmd, 0, 16);
> +	cmd[0] = INQUIRY;
> +	cmd[1] = 1;		/* EVPD */
> +	cmd[2] = page;		/* VPD page */
> +	cmd[3] = len;
> +	
> +	result = scsi_execute_req(sdkp->device, cmd, DMA_FROM_DEVICE, buffer,
> +				  len, &sshdr, SD_TIMEOUT, SD_MAX_RETRIES);
> +
> +	if (media_not_present(sdkp, &sshdr))
> +		return -EIO;
> +
> +	if (result) {
> +		sd_printk(KERN_ERR, sdkp, "EVPD Inquiry failed\n");
> +		return -EIO;
> +	}
> +
> +	if (buffer[1] != page) {
> +		sd_printk(KERN_ERR, sdkp, "Page code not %2x (%2x)\n", page,
> +			  buffer[1]);
> +		return -EIO;
> +	}
> +
> +	return buffer[3];
> +}
> +
> +static void sd_set_elevator(struct scsi_disk *sdkp, unsigned char *buffer)
> +{
> +	struct scsi_device *sdp = sdkp->device;
> +	int res, i, rotation;
> +
> +	res = sd_vpd_inquiry(sdkp, buffer, 0, 255);
> +	if (res < 0)
> +		return;
> +
> +	for (i = 0; i < buffer[3]; i++)
> +		if (buffer[i + 4] == 0xb1)
> +			goto found;
> +	return;
> +
> + found:
> +	res = sd_vpd_inquiry(sdkp, buffer, 0xb1, 64);
> +	if (res < 0)
> +		return;
> +
> +	rotation = (buffer[4] << 8) | buffer[5];
> +
> +	if (rotation == 0)
> +		return;
> +
> +	if (rotation == 0x0001) {
> +#if 0
> +		res = elv_iosched_store(sdp->request_queue, "noop", 5);
> +		if (res >= 0)
> +			sd_printk(KERN_INFO, sdkp,
> +						"Switched to noop elevator\n");
> +#else
> +		elevator_exit(sdp->request_queue->elevator);
> +		sdp->request_queue->elevator = NULL;
> +		elevator_init(sdp->request_queue, "noop");
> +		sd_printk(KERN_INFO, sdkp, "Switched to noop elevator\n");
> +#endif
> +	} else if (rotation > 0x400) {
> +		sd_printk(KERN_INFO, sdkp, "%u RPM drive", rotation);
> +	}
> +}
> +
>  /**
>   *	sd_revalidate_disk - called the first time a new disk is seen,
>   *	performs disk spin up, read_capacity, etc.
> @@ -1581,6 +1654,7 @@ static int sd_revalidate_disk(struct gendisk *disk)
>  		sd_read_capacity(sdkp, buffer);
>  		sd_read_write_protect_flag(sdkp, buffer);
>  		sd_read_cache_type(sdkp, buffer);
> +		sd_set_elevator(sdkp, buffer);
>  	}
> 
>  	/*
> -- 
> Intel are signing my paycheques ... these opinions are still mine
> "Bill, look, we understand that you're interested in selling us this
> operating system, but compare it to ours.  We can't possibly take such
> a retrograde step."
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-andmike
--
Michael Anderson
andmike@linux.vnet.ibm.com

  reply	other threads:[~2008-06-19 17:13 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-19 16:03 [DO NOT APPLY] sd take advantage of rotation speed Matthew Wilcox
2008-06-19 17:12 ` Mike Anderson [this message]
2008-06-19 18:10   ` Matthew Wilcox
2008-06-22 12:16 ` Boaz Harrosh
2008-06-22 13:19   ` Matthew Wilcox
2008-06-22 13:27     ` Boaz Harrosh
2008-06-22 13:38 ` James Bottomley
2008-06-22 14:03   ` Matthew Wilcox
2008-06-22 14:41     ` Martin K. Petersen
2008-06-22 18:44       ` Matthew Wilcox
2008-06-25  2:06         ` Martin K. Petersen
2008-06-22 17:26     ` James Bottomley
2008-06-25 13:47 ` Jens Axboe
2008-06-25 13:57   ` Jens Axboe
2008-06-25 14:24   ` Ric Wheeler
2008-06-25 16:25     ` Boaz Harrosh
2008-06-25 16:57       ` Jens Axboe
2008-06-25 17:20         ` Matthew Wilcox
2008-06-25 17:26           ` Jens Axboe
2008-06-25 17:34             ` Matthew Wilcox
2008-06-25 17:43               ` James Bottomley
2008-06-25 17:53                 ` Matthew Wilcox
2008-06-25 18:01                   ` Jens Axboe
2008-06-25 18:06                   ` James Bottomley
2008-06-25 17:59               ` Jens Axboe
2008-06-25 18:06             ` Martin K. Petersen
2008-06-25 18:12               ` Jens Axboe
2008-07-28 13:36               ` Ric Wheeler
2008-07-28 14:10                 ` James Bottomley
2008-07-28 14:31                 ` Martin K. Petersen
2008-07-31 21:00                   ` Grant Grundler
2008-07-31 21:19                     ` Andrew Patterson
2008-07-31 22:26                     ` Ric Wheeler
2008-07-31 23:44                       ` Grant Grundler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080619171258.GA819@linux.vnet.ibm.com \
    --to=andmike@linux.vnet.ibm.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=matthew@wil.cx \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).