summaryrefslogtreecommitdiffstats
path: root/drivers/block/nvme.c
Commit message (Collapse)AuthorAgeFilesLines
* NVMe: Free admin queue memory on initialisation failureMatthew Wilcox2012-08-031-9/+19
| | | | | | | | | | If the adapter fails initialisation, the memory allocated for the admin queue may not be freed. Split the memory freeing part of nvme_free_queue() into nvme_free_queue_mem() and call it in the case of initialisation failure. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com> Reported-by: Vishal Verma <vishal.l.verma@intel.com>
* NVMe: Use ida for nvme device instanceQuoc-Son Anh2012-07-311-5/+26
| | | | | Signed-off-by: Quoc-Son Anh <quoc-sonx.anh@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix whitespace damage in nvme_initMatthew Wilcox2012-07-311-2/+2
| | | | | | | Commit 5c42ea1643 used spaces instead of tabs. Also remove the unnecessary initialisation of the 'result' variable. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: handle allocation failure in nvme_map_user_pages()Dan Carpenter2012-07-311-0/+2
| | | | | | | We should return here and avoid a NULL dereference. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix uninitialized iod compiler warningKeith Busch2012-07-271-1/+1
| | | | | Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Do not set IO queue depth beyond device maxKeith Busch2012-07-271-4/+6
| | | | | | | | Set the depth for IO queues to the device's maximum supported queue entries if the requested depth exceeds the device's capabilities. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Set block queue max sectorsKeith Busch2012-07-261-0/+7
| | | | | | | | Set the max hw sectors in a namespace's request queue if the nvme device has a max data transfer size. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: use namespace id for nvme_get_featuresKeith Busch2012-07-261-2/+2
| | | | | | | | The specification does not provide a use for command dword11 in the NVMe Get Features command, but does use the NSID for some features. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: replace nvme_ns with nvme_dev for user adminKeith Busch2012-07-261-3/+2
| | | | | | | | | The function nvme_user_admin_command does not require a namespace to proceed. Replace with the nvme_dev structure so that it can be called from contexts that do not have a namespace. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix nvme module init when nvme_major is setKeith Busch2012-07-261-2/+4
| | | | | | | | register_blkdev returns 0 when given a valid major number. Reported-by:Ross Zwisler <ross.zwisler@intel.com> Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Set request queue logical block sizeKeith Busch2012-07-251-0/+1
| | | | | | | | Sets the request queue logical block size with the block size of the namespace. Signed-off-by: Keith Busch <keith.busch@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Set number of queues correctlyMatthew Wilcox2012-01-111-3/+17
| | | | | | | | The number of submission & completion queues should be set by calling Set Features, not Get Features. Reported-by: Kwok Kong <Kwok.Kong@idt.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Version 0.8Matthew Wilcox2012-01-101-1/+1
| | | | Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Set queue flags correctlyMatthew Wilcox2012-01-101-2/+4
| | | | | | | | QUEUE_FLAG_* are flags (other than QUEUE_FLAG_DEFAULT), so they cannot be ORed together. Set the queue flags using queue_flag_set_unlocked(). Reported-by: Donald Wood <donald.e.wood@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Simplify nvme_unmap_user_pagesMatthew Wilcox2012-01-101-10/+9
| | | | | | | | | | By using the iod->nents field (the same way other I/O paths do), we can avoid recalculating the number of sg entries at unmap time, and make nvme_unmap_user_pages() easier to call. Also, use the 'write' parameter instead of assuming DMA_FROM_DEVICE. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Mark the end of the sg listMatthew Wilcox2012-01-101-0/+1
| | | | | | | For user I/O and admin commands, we were forgetting to mark the end of the SG list. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix DMA mapping for admin commandsMatthew Wilcox2012-01-101-2/+4
| | | | | | | | | We were always mapping as DMA_FROM_DEVICE then unmapping with DMA_TO_DEVICE which was clearly not correct. Follow the same pattern as nvme_submit_io() and key off the bottom bit of the opcode to determine whether this is a read or a write. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Rename IO_TIMEOUT to NVME_IO_TIMEOUTMatthew Wilcox2012-01-101-4/+4
| | | | | | | IO_TIMEOUT is a little too generic and might be used by other parts of the kernel in the future. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Merge the nvme_bio and nvme_prp data structuresMatthew Wilcox2012-01-101-115/+124
| | | | | | | | The new merged data structure is called nvme_iod. This improves performance for mid-sized I/Os (in the 16k range) since we save a memory allocation. It is also a slightly simpler interface to use. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Change nvme_completion_fn to take a devMatthew Wilcox2012-01-101-18/+25
| | | | | | | The queue is only needed for some rare occasions, and it's more consistent to pass the device around. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Change get_nvmeq to take a dev instead of a namespaceMatthew Wilcox2012-01-101-4/+4
| | | | | | | Upcoming patches require calling get_nvmeq when we don't have a namespace. Some callers already have the device in a local variable anyway. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Simplify completion handlingMatthew Wilcox2012-01-101-86/+81
| | | | | | | | | | Instead of encoding the handler type in the bottom two bits of the per-completion context pointer, store the handler function as well as the context pointer. This gives us more flexibility and the code is clearer. It comes at the cost of an extra 8k of memory per queue, but this feels like a reasonable price to pay. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Implement doorbell stride capabilityMatthew Wilcox2011-11-041-3/+14
| | | | | | | | | The doorbell stride allows devices to spread out their doorbells instead of packing them tightly. This feature was added as part of ECN 003. This patch also enables support for more than 512 queues :-) Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Version 0.7Matthew Wilcox2011-11-041-1/+1
| | | | Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Don't probe namespace 0Matthew Wilcox2011-11-041-1/+1
| | | | | | | ECN 001 documented that namespace 0 is not valid. Sending an Identify with CNS of 0 and Namespace of 0 is an undefined command. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* Fix calculation of number of pages in a PRP ListNisheeth Bhat2011-11-041-7/+7
| | | | | | | | | | | | The existing calculation underestimated the number of pages required as it did not take into account the pointer at the end of each page. The replacement calculation may overestimate the number of pages required if the last page in the PRP List is entirely full. By using ->npages as a counter as we fill in the pages, we ensure that we don't try to free a page that was never allocated. Signed-off-by: Nisheeth Bhat <nisheeth.bhat@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Create nvme_identify and nvme_get_features functionsMatthew Wilcox2011-11-041-33/+43
| | | | | | | | Instead of open-coding calls to nvme_submit_admin_cmd, these small wrappers are simpler to use (the patch removes 14 lines from nvme_dev_add() for example). Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix memory leak in nvme_dev_add()Matthew Wilcox2011-11-041-2/+2
| | | | | | The driver was allocating 8k of memory, then freeing 4k of it. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix calls to dma_unmap_sgNisheeth Bhat2011-11-041-6/+4
| | | | | | | | dma_unmap_sg() must be called with the same 'nents' passed to dma_map_sg(), not the number returned from dma_map_sg(). Signed-off-by: Nisheeth Bhat <nisheeth.bhat@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Correct sg list setup in nvme_map_user_pagesMatthew Wilcox2011-11-041-5/+5
| | | | | | | | | | | | | Our SG list was constructed to always fill the entire first page, even if that was more than the length of the I/O. This is probably harmless, but some IOMMUs might do something bad. Correcting the first call to sg_set_page() made it look a lot closer to the sg_set_page() in the loop, so fold the first call to sg_set_page() into the loop. Reported-by: Nisheeth Bhat <nisheeth.bhat@intel.com> Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
* Fix bug in NVME_IOCTL_SUBMIT_IOMatthew Wilcox2011-11-041-0/+1
| | | | | Missing 'break' in the switch statement meant that we'd fall through to the 'return -EINVAL' case.
* NVMe: Rework ioctlsMatthew Wilcox2011-11-041-88/+40
| | | | | | | | | | | Remove the special-purpose IDENTIFY, GET_RANGE_TYPE, DOWNLOAD_FIRMWARE and ACTIVATE_FIRMWARE commands. Replace them with a generic ADMIN_CMD ioctl that can submit any admin command. Add a new ID ioctl that returns the namespace ID of the queried device. It corresponds to the SCSI Idlun ioctl. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Add the nvme thread to the wait queue before waking it upMatthew Wilcox2011-11-041-0/+2
| | | | | | | | | | If the I/O was not completed by a single NVMe command, we add the bio to the congestion list and wake up the kthread to resubmit it. But the kthread calls remove_wait_queue() unconditionally, which will oops if it's not on the wait queue. So add the kthread to the wait queue before waking it up. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Return real error from nvme_create_queueMatthew Wilcox2011-11-041-4/+4
| | | | | | | | | nvme_setup_io_queues() was assuming that a NULL return from nvme_create_queue() was an out-of-memory error. That's not necessarily true; the adapter might return -EIO, for example. Change the calling convention to return an ERR_PTR on failure instead of NULL. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Version 0.6Matthew Wilcox2011-11-041-1/+1
| | | | Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Add a few calling convention notesMatthew Wilcox2011-11-041-1/+10
| | | | | | | For the benefit of reviewers, add comments to a few functions describing their calling context Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Handle failures from memory allocations in nvme_setup_prpsMatthew Wilcox2011-11-041-15/+41
| | | | | | | | | | | | | | | If any of the memory allocations in nvme_setup_prps fail, handle it by modifying the passed-in data length to reflect the number of bytes we are actually able to send. Also allow the caller to specify the GFP flags they need; for user-initiated commands, we can use GFP_KERNEL allocations. The various callers are updated to handle this possibility; the main I/O path is already prepared for this possibility (as it may happen due to nvme_map_bio being unable to map all the segments of the I/O). The other callers return -ENOMEM instead of doing partial I/Os. Reported-by: Andi Kleen <andi@firstfloor.org> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Use an IDA to allocate minor numbersMatthew Wilcox2011-11-041-4/+34
| | | | | | | | | The current approach of using the namespace ID as the minor number doesn't work when there are multiple adapters in the machine. Rather than statically partitioning the number of namespaces between adapters, dynamically allocate minor numbers to namespaces as they are detected. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Add include of delay.h for msleepMatthew Wilcox2011-11-041-0/+1
| | | | | | Previously it was being implicitly included through some other header file Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Add support for timing out I/OsMatthew Wilcox2011-11-041-6/+31
| | | | | | | In the kthread, walk the list of outstanding I/Os and check they've not hit the timeout. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Rename cancel_cmdid_data to cancel_cmdidMatthew Wilcox2011-11-041-2/+5
| | | | | | | The trailing '_data' on the end was annoying and inconsistent. Also, make it actually return the data since this is needed for timing out commands. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix bug in error handlingMatthew Wilcox2011-11-041-2/+2
| | | | | | | When an I/O completed with an error, we would call bio_endio twice (once with -EIO and once with 0). Found by inspection. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Time out initialisation after a few secondsMatthew Wilcox2011-11-041-0/+10
| | | | | | | | | THe device reports (in its capability register) how long it will take to initialise. If that time elapses before the ready bit becomes set, conclude the device is broken and refuse to initialise it. Log a nice error message so the user knows why we did nothing. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Fix warning in free_irqMatthew Wilcox2011-11-041-1/+3
| | | | | | | We need to clear the affinity mask before calling free_irq() Reported-by: Shane Michael Matthews <shane.matthews@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Correct the Controller Configuration settingsMatthew Wilcox2011-11-041-0/+1
| | | | | | | | | The arbitration field was extended by one bit, shifting the shutdown notification bits by one. Also, the SQ/CQ entry size was made configurable for future extensions. Reported-by: Paul Luse <paul.e.luse@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Version 0.5Matthew Wilcox2011-11-041-1/+1
| | | | Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Change the definition of nvme_user_ioMatthew Wilcox2011-11-041-10/+17
| | | | | | | | | | | | | | | | | | | | | | | The read and write commands don't define a 'result', so there's no need to copy it back to userspace. Remove the ability of the ioctl to submit commands to a different namespace; it's just asking for trouble, and the use case I have in mind will be addressed througha different ioctl in the future. That removes the need for both the block_shift and nsid arguments. Check that the opcode is one of 'read' or 'write'. Future opcodes may be added in the future, but we will need a different structure definition for them. The nblocks field is redefined to be 0-based. This allows the user to request the full 65536 blocks. Don't byteswap the reftag, apptag and appmask. Martin Petersen tells me these are calculated in big-endian and are transmitted to the device in big-endian. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Add compat_ioctlMatthew Wilcox2011-11-041-0/+1
| | | | | | | | | Make ioctls work for 32-bit applications on 64-bit kernels. The structures are defined to be the same for both 32- and 64-bit applications, so we can use the same handler for both. Reported-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Simplify queue lookupMatthew Wilcox2011-11-041-6/+6
| | | | | | | | | Fill in all the num_possible_cpus() entries with duplicate pointers. This reduces the complexity of the frequently-called get_nvmeq(), as well as avoiding a bug in it when there are fewer queues than CPUs. Reported-by: Shane Michael Matthews <shane.matthews@intel.com> Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
* NVMe: Remove the kthread from the wait queueMatthew Wilcox2011-11-041-0/+3
| | | | | | | Once there are no more bios on the congestion list, we can stop waking up the nvme kthread every time a completion happens. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
OpenPOWER on IntegriCloud