[PATCH 6/8] counter: stm32-lptimer-cnt: Use container_of instead of struct counter_device::priv
Uwe Kleine-König
u.kleine-koenig at pengutronix.de
Tue Dec 21 02:45:44 PST 2021
Using counter->priv is a memory read and so more expensive than
container_of which is only an addition. (In this case even a noop
because the offset is 0.)
So container_of is expected to be a tad faster, it's type-safe, and
produces smaller code (ARCH=arm allmodconfig):
add/remove: 0/0 grow/shrink: 0/10 up/down: 0/-140 (-140)
Function old new delta
stm32_lptim_cnt_read 272 260 -12
stm32_lptim_cnt_probe 528 516 -12
stm32_lptim_cnt_function_write 420 408 -12
stm32_lptim_cnt_function_read 184 172 -12
stm32_lptim_cnt_enable_write 436 424 -12
stm32_lptim_cnt_enable_read 312 300 -12
stm32_lptim_cnt_ceiling_write 368 356 -12
stm32_lptim_cnt_ceiling_read 84 72 -12
stm32_lptim_cnt_action_read 388 376 -12
stm32_lptim_cnt_action_write 576 544 -32
Total: Before=6458, After=6318, chg -2.17%
Signed-off-by: Uwe Kleine-König <u.kleine-koenig at pengutronix.de>
---
drivers/counter/stm32-lptimer-cnt.c | 24 ++++++++++++++----------
1 file changed, 14 insertions(+), 10 deletions(-)
diff --git a/drivers/counter/stm32-lptimer-cnt.c b/drivers/counter/stm32-lptimer-cnt.c
index 5168833b1fdf..c6eb3071571f 100644
--- a/drivers/counter/stm32-lptimer-cnt.c
+++ b/drivers/counter/stm32-lptimer-cnt.c
@@ -30,6 +30,11 @@ struct stm32_lptim_cnt {
bool enabled;
};
+static inline struct stm32_lptim_cnt *stm32_lptim_from_counter(struct counter_device *counter)
+{
+ return container_of(counter, struct stm32_lptim_cnt, counter);
+}
+
static int stm32_lptim_is_enabled(struct stm32_lptim_cnt *priv)
{
u32 val;
@@ -141,7 +146,7 @@ static const enum counter_synapse_action stm32_lptim_cnt_synapse_actions[] = {
static int stm32_lptim_cnt_read(struct counter_device *counter,
struct counter_count *count, u64 *val)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
u32 cnt;
int ret;
@@ -158,7 +163,7 @@ static int stm32_lptim_cnt_function_read(struct counter_device *counter,
struct counter_count *count,
enum counter_function *function)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
if (!priv->quadrature_mode) {
*function = COUNTER_FUNCTION_INCREASE;
@@ -177,7 +182,7 @@ static int stm32_lptim_cnt_function_write(struct counter_device *counter,
struct counter_count *count,
enum counter_function function)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
if (stm32_lptim_is_enabled(priv))
return -EBUSY;
@@ -200,7 +205,7 @@ static int stm32_lptim_cnt_enable_read(struct counter_device *counter,
struct counter_count *count,
u8 *enable)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
int ret;
ret = stm32_lptim_is_enabled(priv);
@@ -216,7 +221,7 @@ static int stm32_lptim_cnt_enable_write(struct counter_device *counter,
struct counter_count *count,
u8 enable)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
int ret;
/* Check nobody uses the timer, or already disabled/enabled */
@@ -241,7 +246,7 @@ static int stm32_lptim_cnt_ceiling_read(struct counter_device *counter,
struct counter_count *count,
u64 *ceiling)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
*ceiling = priv->ceiling;
@@ -252,7 +257,7 @@ static int stm32_lptim_cnt_ceiling_write(struct counter_device *counter,
struct counter_count *count,
u64 ceiling)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
if (stm32_lptim_is_enabled(priv))
return -EBUSY;
@@ -277,7 +282,7 @@ static int stm32_lptim_cnt_action_read(struct counter_device *counter,
struct counter_synapse *synapse,
enum counter_synapse_action *action)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
enum counter_function function;
int err;
@@ -321,7 +326,7 @@ static int stm32_lptim_cnt_action_write(struct counter_device *counter,
struct counter_synapse *synapse,
enum counter_synapse_action action)
{
- struct stm32_lptim_cnt *const priv = counter->priv;
+ struct stm32_lptim_cnt *const priv = stm32_lptim_from_counter(counter);
enum counter_function function;
int err;
@@ -438,7 +443,6 @@ static int stm32_lptim_cnt_probe(struct platform_device *pdev)
}
priv->counter.num_counts = 1;
priv->counter.signals = stm32_lptim_cnt_signals;
- priv->counter.priv = priv;
platform_set_drvdata(pdev, priv);
--
2.33.0
More information about the linux-arm-kernel
mailing list