From: Sakari Ailus <sakari.ailus@linux.intel.com>
To: Pavel Machek <pavel@ucw.cz>
Cc: linux-media@vger.kernel.org, kernel list <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/1] et8ek8: Decrease stack usage
Date: Wed, 16 Aug 2017 11:24:41 +0300 [thread overview]
Message-ID: <20170816082440.cuvexc66ctrvvenb@paasikivi.fi.intel.com> (raw)
In-Reply-To: <20170816081305.GA19601@amd>
On Wed, Aug 16, 2017 at 10:13:05AM +0200, Pavel Machek wrote:
> On Wed 2017-08-16 10:33:45, Sakari Ailus wrote:
> > The et8ek8 driver combines I²C register writes to a single array that it
> > passes to i2c_transfer(). The maximum number of writes is 48 at once,
> > decrease it to 8 and make more transfers if needed, thus avoiding a
> > warning on stack usage.
>
> Dunno. Slowing down code to save stack does not sound attractive.
>
> What about this one? Way simpler, too... (Unless there's some rule
> about i2c, DMA and static buffers. Is it?)
>
> Signed-off-by: Pavel Machek <pavel@ucw.cz>
>
> (untested)
> Pavel
>
> diff --git a/drivers/media/i2c/et8ek8/et8ek8_driver.c b/drivers/media/i2c/et8ek8/et8ek8_driver.c
> index f39f517..64da731 100644
> --- a/drivers/media/i2c/et8ek8/et8ek8_driver.c
> +++ b/drivers/media/i2c/et8ek8/et8ek8_driver.c
> @@ -227,7 +227,7 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
> int cnt)
> {
> struct i2c_msg msg[ET8EK8_MAX_MSG];
> - unsigned char data[ET8EK8_MAX_MSG][6];
> + static unsigned char data[ET8EK8_MAX_MSG][6];
Works, but we'll need to serialise calls to the function then.
I'm not really sure if passing multiple messages to i2c_transfer() really
even helps here. I think it could be removed altogether as well.
> int wcnt = 0;
> u16 reg, data_length;
> u32 val;
>
>
>
> > ---
> > Pavel: this is just compile tested. Could you test it on N900, please?
> >
> > drivers/media/i2c/et8ek8/et8ek8_driver.c | 26 +++++++++++++++++---------
> > 1 file changed, 17 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/media/i2c/et8ek8/et8ek8_driver.c b/drivers/media/i2c/et8ek8/et8ek8_driver.c
> > index f39f517..c14f0fd 100644
> > --- a/drivers/media/i2c/et8ek8/et8ek8_driver.c
> > +++ b/drivers/media/i2c/et8ek8/et8ek8_driver.c
> > @@ -43,7 +43,7 @@
> >
> > #define ET8EK8_NAME "et8ek8"
> > #define ET8EK8_PRIV_MEM_SIZE 128
> > -#define ET8EK8_MAX_MSG 48
> > +#define ET8EK8_MAX_MSG 8
> >
> > struct et8ek8_sensor {
> > struct v4l2_subdev subdev;
> > @@ -220,7 +220,8 @@ static void et8ek8_i2c_create_msg(struct i2c_client *client, u16 len, u16 reg,
> >
> > /*
> > * A buffered write method that puts the wanted register write
> > - * commands in a message list and passes the list to the i2c framework
> > + * commands in smaller number of message lists and passes the lists to
> > + * the i2c framework
> > */
> > static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
> > const struct et8ek8_reg *wnext,
> > @@ -231,11 +232,7 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
> > int wcnt = 0;
> > u16 reg, data_length;
> > u32 val;
> > -
> > - if (WARN_ONCE(cnt > ET8EK8_MAX_MSG,
> > - ET8EK8_NAME ": %s: too many messages.\n", __func__)) {
> > - return -EINVAL;
> > - }
> > + int rval;
> >
> > /* Create new write messages for all writes */
> > while (wcnt < cnt) {
> > @@ -249,10 +246,21 @@ static int et8ek8_i2c_buffered_write_regs(struct i2c_client *client,
> >
> > /* Update write count */
> > wcnt++;
> > +
> > + if (wcnt < ET8EK8_MAX_MSG)
> > + continue;
> > +
> > + rval = i2c_transfer(client->adapter, msg, wcnt);
> > + if (rval < 0)
> > + return rval;
> > +
> > + cnt -= wcnt;
> > + wcnt = 0;
> > }
> >
> > - /* Now we send everything ... */
> > - return i2c_transfer(client->adapter, msg, wcnt);
> > + rval = i2c_transfer(client->adapter, msg, wcnt);
> > +
> > + return rval < 0 ? rval : 0;
> > }
> >
> > /*
>
> --
> (english) http://www.livejournal.com/~pavelmachek
> (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
Sakari Ailus
sakari.ailus@linux.intel.com
prev parent reply other threads:[~2017-08-16 8:24 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1502868825-4531-1-git-send-email-sakari.ailus@linux.intel.com>
2017-08-16 8:13 ` Pavel Machek
2017-08-16 8:24 ` Sakari Ailus [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170816082440.cuvexc66ctrvvenb@paasikivi.fi.intel.com \
--to=sakari.ailus@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=pavel@ucw.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®