Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b5fbe819 authored by Rui Miguel Silva's avatar Rui Miguel Silva Committed by Greg Kroah-Hartman
Browse files

greybus: power_supply: invalidate cache at update request



When we receive a update request we shall not trust the cache mechanism
and for that we need a way to invalidate the cache. Add a field that
will control the cache status and refactor the code to check if cache is
valid in a helper function.

This will fix the scenario where an update request is received within
the cache expiration time after a previous update as happened and would
be ignored.

Signed-off-by: default avatarRui Miguel Silva <rui.silva@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 5f66d62e
Loading
Loading
Loading
Loading
+26 −5
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ struct gb_power_supply {
	u8				properties_count;
	u8				properties_count_str;
	unsigned long			last_update;
	u8				cache_invalid;
	unsigned int			update_interval;
	bool				changed;
	struct gb_power_supply_prop	*props;
@@ -636,15 +637,28 @@ static int _gb_power_supply_property_get(struct gb_power_supply *gbpsy,
	return 0;
}

static int gb_power_supply_status_get(struct gb_power_supply *gbpsy)
static int is_cache_valid(struct gb_power_supply *gbpsy)
{
	int ret = 0;
	int i;
	/* check if cache is good enough or it has expired */
	if (gbpsy->cache_invalid) {
		gbpsy->cache_invalid = 0;
		return 0;
	}

	/* check if cache is good enough */
	if (gbpsy->last_update &&
	    time_is_after_jiffies(gbpsy->last_update +
				  msecs_to_jiffies(cache_time)))
		return 1;

	return 0;
}

static int gb_power_supply_status_get(struct gb_power_supply *gbpsy)
{
	int ret = 0;
	int i;

	if (is_cache_valid(gbpsy))
		return 0;

	for (i = 0; i < gbpsy->properties_count; i++) {
@@ -987,8 +1001,15 @@ static int gb_supplies_request_handler(struct gb_operation *op)
		goto out_unlock;
	}

	if (event & GB_POWER_SUPPLY_UPDATE)
	if (event & GB_POWER_SUPPLY_UPDATE) {
		/*
		 * we need to make sure we invalidate cache, if not no new
		 * values for the properties will be fetch and the all propose
		 * of this event is missed
		 */
		gbpsy->cache_invalid = 1;
		gb_power_supply_status_update(gbpsy);
	}

out_unlock:
	mutex_unlock(&supplies->supplies_lock);