Message ID | 20191111060557.15650-1-cw00.choi@samsung.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | [v2] PM / devfreq: events: Fix excessive stack usage | expand |
On 11/11/19 3:05 PM, Chanwoo Choi wrote: > From: Arnd Bergmann <arnd@arndb.de> > > Putting a 'struct devfreq_event_dev' object on the stack is generally > a bad idea and here it leads to a warnig about potential stack overflow: > > drivers/devfreq/event/exynos-ppmu.c:643:12: error: stack frame size of 1040 bytes in function 'exynos_ppmu_probe' [-Werror,-Wframe-larger-than=] > > There is no real need for the device structure, only the string inside > it, so add an internal helper function that simply takes the string > as its argument and remove the device structure. > > Fixes: 1dd62c66d345 ("PM / devfreq: events: extend events by type of counted data") > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > [cw00.choi: Fix the issue from 'desc->name' to 'desc[j].name'] > Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> > --- > Changes from v1: > - Fix the issue from 'desc->name' to 'desc[j].name' > > drivers/devfreq/event/exynos-ppmu.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c > index 85c7a77bf3f0..055deea42c37 100644 > --- a/drivers/devfreq/event/exynos-ppmu.c > +++ b/drivers/devfreq/event/exynos-ppmu.c > @@ -101,17 +101,22 @@ static struct __exynos_ppmu_events { > PPMU_EVENT(dmc1_1), > }; > > -static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev) > +static int __exynos_ppmu_find_ppmu_id(const char *edev_name) > { > int i; > > for (i = 0; i < ARRAY_SIZE(ppmu_events); i++) > - if (!strcmp(edev->desc->name, ppmu_events[i].name)) > + if (!strcmp(edev_name, ppmu_events[i].name)) > return ppmu_events[i].id; > > return -EINVAL; > } > > +static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev) > +{ > + return __exynos_ppmu_find_ppmu_id(edev->desc->name); > +} > + > /* > * The devfreq-event ops structure for PPMU v1.1 > */ > @@ -556,13 +561,11 @@ static int of_get_devfreq_events(struct device_node *np, > * use default if not. > */ > if (info->ppmu_type == EXYNOS_TYPE_PPMU_V2) { > - struct devfreq_event_dev edev; > int id; > /* Not all registers take the same value for > * read+write data count. > */ > - edev.desc = &desc[j]; > - id = exynos_ppmu_find_ppmu_id(&edev); > + id = __exynos_ppmu_find_ppmu_id(desc[j].name); > > switch (id) { > case PPMU_PMNCNT0: > Applied it. Thanks.
diff --git a/drivers/devfreq/event/exynos-ppmu.c b/drivers/devfreq/event/exynos-ppmu.c index 85c7a77bf3f0..055deea42c37 100644 --- a/drivers/devfreq/event/exynos-ppmu.c +++ b/drivers/devfreq/event/exynos-ppmu.c @@ -101,17 +101,22 @@ static struct __exynos_ppmu_events { PPMU_EVENT(dmc1_1), }; -static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev) +static int __exynos_ppmu_find_ppmu_id(const char *edev_name) { int i; for (i = 0; i < ARRAY_SIZE(ppmu_events); i++) - if (!strcmp(edev->desc->name, ppmu_events[i].name)) + if (!strcmp(edev_name, ppmu_events[i].name)) return ppmu_events[i].id; return -EINVAL; } +static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev) +{ + return __exynos_ppmu_find_ppmu_id(edev->desc->name); +} + /* * The devfreq-event ops structure for PPMU v1.1 */ @@ -556,13 +561,11 @@ static int of_get_devfreq_events(struct device_node *np, * use default if not. */ if (info->ppmu_type == EXYNOS_TYPE_PPMU_V2) { - struct devfreq_event_dev edev; int id; /* Not all registers take the same value for * read+write data count. */ - edev.desc = &desc[j]; - id = exynos_ppmu_find_ppmu_id(&edev); + id = __exynos_ppmu_find_ppmu_id(desc[j].name); switch (id) { case PPMU_PMNCNT0: