This is the complement of the existing behavior to match only messages with
a log level less than a threshold. This is primarily useful in conjunction
with LOGFF_DENY.

Signed-off-by: Sean Anderson <sean...@gmail.com>
Reviewed-by: Simon Glass <s...@chromium.org>
---

(no changes since v1)

 common/log.c  | 12 +++++++++---
 include/log.h | 10 ++++++----
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/common/log.c b/common/log.c
index 878800b3bb..259d922987 100644
--- a/common/log.c
+++ b/common/log.c
@@ -159,11 +159,17 @@ static bool log_passes_filters(struct log_device *ldev, 
struct log_rec *rec)
        }
 
        list_for_each_entry(filt, &ldev->filter_head, sibling_node) {
-               if (rec->level > filt->max_level)
+               if (filt->flags & LOGFF_LEVEL_MIN) {
+                       if (rec->level < filt->level)
+                               continue;
+               } else if (rec->level > filt->level) {
                        continue;
+               }
+
                if ((filt->flags & LOGFF_HAS_CAT) &&
                    !log_has_cat(filt->cat_list, rec->cat))
                        continue;
+
                if (filt->file_list &&
                    !log_has_file(filt->file_list, rec->file))
                        continue;
@@ -238,7 +244,7 @@ int _log(enum log_category_t cat, enum log_level_t level, 
const char *file,
 }
 
 int log_add_filter_flags(const char *drv_name, enum log_category_t cat_list[],
-                        enum log_level_t max_level, const char *file_list,
+                        enum log_level_t level, const char *file_list,
                         int flags)
 {
        struct log_filter *filt;
@@ -266,7 +272,7 @@ int log_add_filter_flags(const char *drv_name, enum 
log_category_t cat_list[],
                                break;
                }
        }
-       filt->max_level = max_level;
+       filt->level = level;
        if (file_list) {
                filt->file_list = strdup(file_list);
                if (!filt->file_list) {
diff --git a/include/log.h b/include/log.h
index 8cabe82eb5..d5e09a838f 100644
--- a/include/log.h
+++ b/include/log.h
@@ -365,6 +365,8 @@ enum log_filter_flags {
        LOGFF_HAS_CAT   = 1 << 0,
        /** @LOGFF_DENY: Filter denies matching messages */
        LOGFF_DENY      = 1 << 1,
+       /** @LOGFF_LEVEL_MIN: Filter's level is a minimum, not a maximum */
+       LOGFF_LEVEL_MIN = 1 << 2,
 };
 
 /**
@@ -380,7 +382,7 @@ enum log_filter_flags {
  * @cat_list: List of categories to allow (terminated by %LOGC_END). If empty
  *     then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries
  *     can be provided
- * @max_level: Maximum log level to allow
+ * @level: Maximum (or minimum, if LOGFF_MIN_LEVEL) log level to allow
  * @file_list: List of files to allow, separated by comma. If NULL then all
  *     files are permitted
  * @sibling_node: Next filter in the list of filters for this log device
@@ -389,7 +391,7 @@ struct log_filter {
        int filter_num;
        int flags;
        enum log_category_t cat_list[LOGF_MAX_CATEGORIES];
-       enum log_level_t max_level;
+       enum log_level_t level;
        const char *file_list;
        struct list_head sibling_node;
 };
@@ -490,14 +492,14 @@ int do_log_test(struct cmd_tbl *cmdtp, int flag, int 
argc, char *const argv[]);
  * @cat_list: List of categories to allow (terminated by %LOGC_END). If empty
  *     then all categories are permitted. Up to LOGF_MAX_CATEGORIES entries
  *     can be provided
- * @max_level: Maximum log level to allow
+ * @level: Maximum (or minimum, if LOGFF_LEVEL_MIN) log level to allow
  * @file_list: List of files to allow, separated by comma. If NULL then all
  *     files are permitted
  * @return the sequence number of the new filter (>=0) if the filter was added,
  *     or a -ve value on error
  */
 int log_add_filter_flags(const char *drv_name, enum log_category_t cat_list[],
-                        enum log_level_t max_level, const char *file_list,
+                        enum log_level_t level, const char *file_list,
                         int flags);
 
 /**
-- 
2.28.0

Reply via email to