Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1205882 > unrolled thread
| Started by | Markus Pargmann <mpa@pengutronix.de> |
|---|---|
| First post | 2015-08-12 12:20 +0200 |
| Last post | 2015-08-12 13:00 +0200 |
| Articles | 2 — 2 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
[PATCH 05/20] regmap: Restructure writes in _regmap_raw_write() Markus Pargmann <mpa@pengutronix.de> - 2015-08-12 12:20 +0200
Re: [PATCH 05/20] regmap: Restructure writes in _regmap_raw_write() Mark Brown <broonie@kernel.org> - 2015-08-12 13:00 +0200
| From | Markus Pargmann <mpa@pengutronix.de> |
|---|---|
| Date | 2015-08-12 12:20 +0200 |
| Subject | [PATCH 05/20] regmap: Restructure writes in _regmap_raw_write() |
| Message-ID | <pWBiy-1oV-13@gated-at.bofh.it> |
Currently we try to write the data without copying directly using
bus->write() or bus->gather_write() if it exists. If one of the previous
tries to write reported -ENOTSUPP or none of them were usable, we copy
the data into a buffer and use bus->write().
However it does not make sense to try bus->write() a second time with a
copied buffer if it didn't work the first time.
This patch restructures this if/else block to make it clear that this is
not intended for the case where bus->write() returns -ENOTSUPP.
Signed-off-by: Markus Pargmann <mpa@pengutronix.de>
---
drivers/base/regmap/regmap.c | 40 ++++++++++++++++++++++------------------
1 file changed, 22 insertions(+), 18 deletions(-)
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 86e94be3c749..f6bd3517a472 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -1340,30 +1340,34 @@ int _regmap_raw_write(struct regmap *map, unsigned int reg,
* send the work_buf directly, otherwise try to do a gather
* write.
*/
- if (val == work_val)
+ if (val == work_val) {
ret = map->bus->write(map->bus_context, map->work_buf,
map->format.reg_bytes +
map->format.pad_bytes +
val_len);
- else if (map->bus->gather_write)
- ret = map->bus->gather_write(map->bus_context, map->work_buf,
- map->format.reg_bytes +
- map->format.pad_bytes,
- val, val_len);
-
- /* If that didn't work fall back on linearising by hand. */
- if (ret == -ENOTSUPP) {
- len = map->format.reg_bytes + map->format.pad_bytes + val_len;
- buf = kzalloc(len, GFP_KERNEL);
- if (!buf)
- return -ENOMEM;
+ } else {
+ if (map->bus->gather_write)
+ ret = map->bus->gather_write(map->bus_context,
+ map->work_buf,
+ map->format.reg_bytes +
+ map->format.pad_bytes,
+ val, val_len);
+
+ /* If that didn't work fall back on linearising by hand. */
+ if (ret == -ENOTSUPP) {
+ len = map->format.reg_bytes + map->format.pad_bytes +
+ val_len;
+ buf = kzalloc(len, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
- memcpy(buf, map->work_buf, map->format.reg_bytes);
- memcpy(buf + map->format.reg_bytes + map->format.pad_bytes,
- val, val_len);
- ret = map->bus->write(map->bus_context, buf, len);
+ memcpy(buf, map->work_buf, map->format.reg_bytes);
+ memcpy(buf + map->format.reg_bytes +
+ map->format.pad_bytes, val, val_len);
+ ret = map->bus->write(map->bus_context, buf, len);
- kfree(buf);
+ kfree(buf);
+ }
}
trace_regmap_hw_write_done(map, reg, val_len / map->format.val_bytes);
--
2.4.6
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Mark Brown <broonie@kernel.org> |
|---|---|
| Date | 2015-08-12 13:00 +0200 |
| Message-ID | <pWBVf-28z-13@gated-at.bofh.it> |
| In reply to | #1205882 |
[Multipart message — attachments visible in raw view] — view raw
On Wed, Aug 12, 2015 at 12:12:30PM +0200, Markus Pargmann wrote: > Currently we try to write the data without copying directly using > bus->write() or bus->gather_write() if it exists. If one of the previous > tries to write reported -ENOTSUPP or none of them were usable, we copy > the data into a buffer and use bus->write(). > > However it does not make sense to try bus->write() a second time with a > copied buffer if it didn't work the first time. > > This patch restructures this if/else block to make it clear that this is > not intended for the case where bus->write() returns -ENOTSUPP. I'm not entirely convinced that this is an improvement. The main effect that I'm seeing is an increase in the indentation level and there are potential issues with the write operation being unable to work with some kinds of memory (like restrictions about dmaing from stack or unalinged memory for example) which mean that copying into a newly allocated buffer may actually help. I don't think we detect any such restrictions at the minute but the defensiveness is nice and I'd really hope that the failed write case isn't any kind of fast path.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web