diff mbox

[4/5] opp: handle allocation of device_opp in a separate routine

Message ID b759d2563caee1189b543d7a3acb222d316d81a1.1418184737.git.viresh.kumar@linaro.org
State New
Headers show

Commit Message

Viresh Kumar Dec. 10, 2014, 4:15 a.m. UTC
Get the 'device_opp' allocation code into a separate routine to keep only the
necessary part in dev_pm_opp_add_dynamic().

Also do s/sizeof(struct device_opp)/sizeof(*dev_opp) and remove the print
message on kzalloc() failure as checkpatch warns for that.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 drivers/base/power/opp.c | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

Comments

Viresh Kumar Dec. 11, 2014, 3:15 a.m. UTC | #1
On 11 December 2014 at 03:31, Rafael J. Wysocki <rjw@rjwysocki.net> wrote:
> I've lost patches [1-2/5] somehow, but never mind.  I can get them from Patchwork.

Strange, you were always in --to for them ..

> In this one I'm wondering about the printk removal mentioned above.  Did
> checkpatch complain about the printk?

commit ebfdc40969f24fc0cdd1349835d36e8ebae05374
Author: Joe Perches <joe@perches.com>
Date:   Wed Aug 6 16:10:27 2014 -0700

    checkpatch: attempt to find unnecessary 'out of memory' messages

    Logging messages that show some type of "out of memory" error are
    generally unnecessary as there is a generic message and a stack dump
    done by the memory subsystem.

    These messages generally increase kernel size without much added value.

    Emit a warning on these types of messages.

    This test looks for any inserted message function, then looks at the
    previous line for an "if (!foo)" or "if (foo == NULL)" test and then
    looks at the preceding statement for an allocation function like "foo =
    kmalloc()"

    ie: this code matches:

        foo = kmalloc();
        if (foo == NULL) {
                printk("Out of memory\n");
                return -ENOMEM;
        }

    This test is very crude and incomplete.

    This test can miss quite a lot of of OOM messages that do not have this
    specific form.

    ie: this code does not match:

        foo = kmalloc();
        if (!foo) {
                rtn = -ENOMEM;
                printk("Out of memory!\n");
                goto out;
        }

    This test could also be a false positive when the logging message itself
    does not specify anything about memory, but I did not find any false
    positives in my limited testing.

    spatch could be a better solution but correctness seems non-trivial for
    that tool too.
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Viresh Kumar Dec. 12, 2014, 3:34 a.m. UTC | #2
On 12 December 2014 at 02:22, Rafael J. Wysocki <rjw@rjwysocki.net> wrote:
> OK
>
> So I've applied this, but here are the rules for the future regarding
> checkpatch.pl:
>
> (1) checkpatch.pl is meant for checking changes made by a patch and *not* for
>     checking the existing code.
>
> (2) Always use common sense on top of checkpatch.pl complaints.

Correct, normally I do ignore the warnings for cases which I don't care about.
I did react to this one because there have been patches going around removing
print messages on allocation failures. And I didn't wanted to get another one
for this and so removed it in my patch only..

--
viresh
--
To unsubscribe from this list: send the line "unsubscribe linux-pm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c
index 525ffb202d77..1150b9d2e012 100644
--- a/drivers/base/power/opp.c
+++ b/drivers/base/power/opp.c
@@ -386,6 +386,27 @@  struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
 
+static struct device_opp *add_device_opp(struct device *dev)
+{
+	struct device_opp *dev_opp;
+
+	/*
+	 * Allocate a new device OPP table. In the infrequent case where a new
+	 * device is needed to be added, we pay this penalty.
+	 */
+	dev_opp = kzalloc(sizeof(*dev_opp), GFP_KERNEL);
+	if (!dev_opp)
+		return NULL;
+
+	dev_opp->dev = dev;
+	srcu_init_notifier_head(&dev_opp->srcu_head);
+	INIT_LIST_HEAD(&dev_opp->opp_list);
+
+	/* Secure the device list modification */
+	list_add_rcu(&dev_opp->node, &dev_opp_list);
+	return dev_opp;
+}
+
 static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
 				  unsigned long u_volt, bool dynamic)
 {
@@ -412,27 +433,13 @@  static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
 	/* Check for existing list for 'dev' */
 	dev_opp = find_device_opp(dev);
 	if (IS_ERR(dev_opp)) {
-		/*
-		 * Allocate a new device OPP table. In the infrequent case
-		 * where a new device is needed to be added, we pay this
-		 * penalty.
-		 */
-		dev_opp = kzalloc(sizeof(struct device_opp), GFP_KERNEL);
+		dev_opp = add_device_opp(dev);
 		if (!dev_opp) {
 			mutex_unlock(&dev_opp_list_lock);
 			kfree(new_opp);
-			dev_warn(dev,
-				"%s: Unable to create device OPP structure\n",
-				__func__);
 			return -ENOMEM;
 		}
 
-		dev_opp->dev = dev;
-		srcu_init_notifier_head(&dev_opp->srcu_head);
-		INIT_LIST_HEAD(&dev_opp->opp_list);
-
-		/* Secure the device list modification */
-		list_add_rcu(&dev_opp->node, &dev_opp_list);
 		head = &dev_opp->opp_list;
 		goto list_add;
 	}