NVMe: Add pci suspend/resume driver callbacks
Keith Busch
keith.busch at intel.com
Thu May 8 08:08:22 PDT 2014
Hi Dan,
On Thu, 8 May 2014, Dan Carpenter wrote:
> 797 if (!nvmeq) {
> 798 put_nvmeq(NULL);
> ^^^^
> You can't pass a NULL to put_nvmeq(), it will just Oops.
Does it? Let's follow this through:
static void put_nvmeq(struct nvme_queue *nvmeq) __releases(RCU)
{
rcu_read_unlock();
put_cpu_var(nvmeq->dev->io_queue);
}
This will use 'NULL' in put_cpu_var, and here's that macro:
#define put_cpu_var(var) do { \
(void)&(var); \
preempt_enable(); \
} while (0)
That's a no-op, right? It is on my config, so it appears to be safe (for
now). I'd agree it's not a good idea relying on that macro to never use
this parameter, though.
Maybe do this instead:
@@ -282,6 +282,12 @@ static struct nvme_queue *get_nvmeq(struct nvme_dev *dev) __acquires(RCU)
return rcu_dereference(dev->queues[queue_id]);
}
+static void put_nvmeq(struct nvme_dev *dev) __releases(RCU)
+{
+ rcu_read_unlock();
+ put_cpu_var(dev->io_queue);
+}
+
static void put_nvmeq(struct nvme_queue *nvmeq) __releases(RCU)
{
rcu_read_unlock();
@@ -801,7 +807,7 @@ static void nvme_make_request(struct request_queue *q, struct bio *bio)
int result = -EBUSY;
if (!nvmeq) {
- put_nvmeq(NULL);
+ put_ioqueue(ns->dev);
bio_endio(bio, -EIO);
return;
}
More information about the Linux-nvme
mailing list