summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/block/blkcache.c23
-rw-r--r--include/blk.h9
-rw-r--r--test/test-main.c3
3 files changed, 20 insertions, 15 deletions
diff --git a/drivers/block/blkcache.c b/drivers/block/blkcache.c
index b53420a3a88..f99465aa479 100644
--- a/drivers/block/blkcache.c
+++ b/drivers/block/blkcache.c
@@ -150,8 +150,8 @@ void blkcache_invalidate(int iftype, int devnum)
list_for_each_safe(entry, n, &block_cache) {
node = (struct block_cache_node *)entry;
- if ((node->iftype == iftype) &&
- (node->devnum == devnum)) {
+ if (iftype == -1 ||
+ (node->iftype == iftype && node->devnum == devnum)) {
list_del(entry);
free(node->cache);
free(node);
@@ -162,18 +162,10 @@ void blkcache_invalidate(int iftype, int devnum)
void blkcache_configure(unsigned blocks, unsigned entries)
{
- struct block_cache_node *node;
+ /* invalidate cache if there is a change */
if ((blocks != _stats.max_blocks_per_entry) ||
- (entries != _stats.max_entries)) {
- /* invalidate cache */
- while (!list_empty(&block_cache)) {
- node = (struct block_cache_node *)block_cache.next;
- list_del(&node->lh);
- free(node->cache);
- free(node);
- }
- _stats.entries = 0;
- }
+ (entries != _stats.max_entries))
+ blkcache_invalidate(-1, 0);
_stats.max_blocks_per_entry = blocks;
_stats.max_entries = entries;
@@ -188,3 +180,8 @@ void blkcache_stats(struct block_cache_stats *stats)
_stats.hits = 0;
_stats.misses = 0;
}
+
+void blkcache_free(void)
+{
+ blkcache_invalidate(-1, 0);
+}
diff --git a/include/blk.h b/include/blk.h
index e854166edb9..c8cbb64c7f8 100644
--- a/include/blk.h
+++ b/include/blk.h
@@ -147,8 +147,8 @@ void blkcache_fill(int iftype, int dev,
* blkcache_invalidate() - discard the cache for a set of blocks
* because of a write or device (re)initialization.
*
- * @param iftype - uclass_id_x for type of device
- * @param dev - device index of particular type
+ * @iftype - UCLASS_ID_ for type of device, or -1 for any
+ * @dev - device index of particular type, if @iftype is not -1
*/
void blkcache_invalidate(int iftype, int dev);
@@ -178,6 +178,9 @@ struct block_cache_stats {
*/
void blkcache_stats(struct block_cache_stats *stats);
+/** blkcache_free() - free all memory allocated to the block cache */
+void blkcache_free(void);
+
#else
static inline int blkcache_read(int iftype, int dev,
@@ -193,6 +196,8 @@ static inline void blkcache_fill(int iftype, int dev,
static inline void blkcache_invalidate(int iftype, int dev) {}
+static inline void blkcache_free(void) {}
+
#endif
#if CONFIG_IS_ENABLED(BLK)
diff --git a/test/test-main.c b/test/test-main.c
index fe3ef6daad6..867c57f3e7a 100644
--- a/test/test-main.c
+++ b/test/test-main.c
@@ -5,6 +5,7 @@
*/
#include <common.h>
+#include <blk.h>
#include <console.h>
#include <cyclic.h>
#include <dm.h>
@@ -352,6 +353,8 @@ static int test_post_run(struct unit_test_state *uts, struct unit_test *test)
free(uts->of_other);
uts->of_other = NULL;
+ blkcache_free();
+
return 0;
}