Message ID | 20180926215155.13512.30900.stgit@localhost.localdomain (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add NUMA aware async_schedule calls | expand |
On Wed, Sep 26, 2018 at 2:52 PM Alexander Duyck <alexander.h.duyck@linux.intel.com> wrote: > > This change makes it so that we use the device specific version of the > async_schedule commands to defer various tasks related to devices. By doing > this we should see a slight improvement in performance as any device that > is sensitive to latency/locality in the setup will now be initializing on > the node closest to the device. > > Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> > --- > drivers/base/dd.c | 4 ++-- > drivers/base/power/main.c | 12 ++++++------ > 2 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > index 5ba366c1cb83..81472dc44a70 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -826,7 +826,7 @@ static int __device_attach(struct device *dev, bool allow_async) > */ > dev_dbg(dev, "scheduling asynchronous probe\n"); > get_device(dev); > - async_schedule(__device_attach_async_helper, dev); > + async_schedule_dev(__device_attach_async_helper, dev); > } else { > pm_request_idle(dev); > } > @@ -927,7 +927,7 @@ static int __driver_attach(struct device *dev, void *data) > if (!dev->driver) { > get_device(dev); > dev_set_drvdata(dev, drv); > - async_schedule(__driver_attach_async_helper, dev); > + async_schedule_dev(__driver_attach_async_helper, dev); > } Above looks good to me... > device_unlock(dev); > return 0; > diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c > index 3f68e2919dc5..8495d9b1e9d0 100644 > --- a/drivers/base/power/main.c > +++ b/drivers/base/power/main.c Let's split these changes into their own patch, just in case it causes a suspend regression we can revert it independently of the async probing change. It might also be worthwhile to have a positive indication that this improves the latency of power transitions.
diff --git a/drivers/base/dd.c b/drivers/base/dd.c index 5ba366c1cb83..81472dc44a70 100644 --- a/drivers/base/dd.c +++ b/drivers/base/dd.c @@ -826,7 +826,7 @@ static int __device_attach(struct device *dev, bool allow_async) */ dev_dbg(dev, "scheduling asynchronous probe\n"); get_device(dev); - async_schedule(__device_attach_async_helper, dev); + async_schedule_dev(__device_attach_async_helper, dev); } else { pm_request_idle(dev); } @@ -927,7 +927,7 @@ static int __driver_attach(struct device *dev, void *data) if (!dev->driver) { get_device(dev); dev_set_drvdata(dev, drv); - async_schedule(__driver_attach_async_helper, dev); + async_schedule_dev(__driver_attach_async_helper, dev); } device_unlock(dev); return 0; diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 3f68e2919dc5..8495d9b1e9d0 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -726,7 +726,7 @@ void dpm_noirq_resume_devices(pm_message_t state) reinit_completion(&dev->power.completion); if (is_async(dev)) { get_device(dev); - async_schedule(async_resume_noirq, dev); + async_schedule_dev(async_resume_noirq, dev); } } @@ -883,7 +883,7 @@ void dpm_resume_early(pm_message_t state) reinit_completion(&dev->power.completion); if (is_async(dev)) { get_device(dev); - async_schedule(async_resume_early, dev); + async_schedule_dev(async_resume_early, dev); } } @@ -1047,7 +1047,7 @@ void dpm_resume(pm_message_t state) reinit_completion(&dev->power.completion); if (is_async(dev)) { get_device(dev); - async_schedule(async_resume, dev); + async_schedule_dev(async_resume, dev); } } @@ -1366,7 +1366,7 @@ static int device_suspend_noirq(struct device *dev) if (is_async(dev)) { get_device(dev); - async_schedule(async_suspend_noirq, dev); + async_schedule_dev(async_suspend_noirq, dev); return 0; } return __device_suspend_noirq(dev, pm_transition, false); @@ -1569,7 +1569,7 @@ static int device_suspend_late(struct device *dev) if (is_async(dev)) { get_device(dev); - async_schedule(async_suspend_late, dev); + async_schedule_dev(async_suspend_late, dev); return 0; } @@ -1830,7 +1830,7 @@ static int device_suspend(struct device *dev) if (is_async(dev)) { get_device(dev); - async_schedule(async_suspend, dev); + async_schedule_dev(async_suspend, dev); return 0; }
This change makes it so that we use the device specific version of the async_schedule commands to defer various tasks related to devices. By doing this we should see a slight improvement in performance as any device that is sensitive to latency/locality in the setup will now be initializing on the node closest to the device. Signed-off-by: Alexander Duyck <alexander.h.duyck@linux.intel.com> --- drivers/base/dd.c | 4 ++-- drivers/base/power/main.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-)