On 3/7/2019 1:23 AM, Vishal Goel wrote:
1) Small Memory Optimization
For eg. if there are 20000 rules, then it will save 625KB(20000*32),
which is critical for small embedded systems.
2) Reducing the time taken in writing rules on load/load2 interface
3) Since global rule list is just used to read the rules, so there
will be no performance impact on system

Signed-off-by: Vishal Goel <vishal.g...@samsung.com>
Signed-off-by: Amit Sahrawat <a.sahra...@samsung.com>

I have taken this patch in for
        https://github.com/cschaufler/next-smack.git#smack-for-5.2

---
  security/smack/smackfs.c | 53 ++++++++++++++----------------------------------
  1 file changed, 15 insertions(+), 38 deletions(-)

diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index f6482e5..2a8a1f5 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -67,7 +67,6 @@ enum smk_inos {
  /*
   * List locks
   */
-static DEFINE_MUTEX(smack_master_list_lock);
  static DEFINE_MUTEX(smack_cipso_lock);
  static DEFINE_MUTEX(smack_ambient_lock);
  static DEFINE_MUTEX(smk_net4addr_lock);
@@ -134,15 +133,7 @@ enum smk_inos {
/*
   * Rule lists are maintained for each label.
- * This master list is just for reading /smack/load and /smack/load2.
   */
-struct smack_master_list {
-       struct list_head        list;
-       struct smack_rule       *smk_rule;
-};
-
-static LIST_HEAD(smack_rule_list);
-
  struct smack_parsed_rule {
        struct smack_known      *smk_subject;
        struct smack_known      *smk_object;
@@ -211,7 +202,6 @@ static void smk_netlabel_audit_set(struct netlbl_audit *nap)
   * @srp: the rule to add or replace
   * @rule_list: the list of rules
   * @rule_lock: the rule list lock
- * @global: if non-zero, indicates a global rule
   *
   * Looks through the current subject/object/access list for
   * the subject/object pair and replaces the access that was
@@ -223,10 +213,9 @@ static void smk_netlabel_audit_set(struct netlbl_audit 
*nap)
   */
  static int smk_set_access(struct smack_parsed_rule *srp,
                                struct list_head *rule_list,
-                               struct mutex *rule_lock, int global)
+                               struct mutex *rule_lock)
  {
        struct smack_rule *sp;
-       struct smack_master_list *smlp;
        int found = 0;
        int rc = 0;
@@ -258,22 +247,6 @@ static int smk_set_access(struct smack_parsed_rule *srp,
                sp->smk_access = srp->smk_access1 & ~srp->smk_access2;
list_add_rcu(&sp->list, rule_list);
-               /*
-                * If this is a global as opposed to self and a new rule
-                * it needs to get added for reporting.
-                */
-               if (global) {
-                       mutex_unlock(rule_lock);
-                       smlp = kzalloc(sizeof(*smlp), GFP_KERNEL);
-                       if (smlp != NULL) {
-                               smlp->smk_rule = sp;
-                               mutex_lock(&smack_master_list_lock);
-                               list_add_rcu(&smlp->list, &smack_rule_list);
-                               mutex_unlock(&smack_master_list_lock);
-                       } else
-                               rc = -ENOMEM;
-                       return rc;
-               }
        }
out:
@@ -540,9 +513,9 @@ static ssize_t smk_write_rules_list(struct file *file, 
const char __user *buf,
if (rule_list == NULL)
                        rc = smk_set_access(&rule, &rule.smk_subject->smk_rules,
-                               &rule.smk_subject->smk_rules_lock, 1);
+                               &rule.smk_subject->smk_rules_lock);
                else
-                       rc = smk_set_access(&rule, rule_list, rule_lock, 0);
+                       rc = smk_set_access(&rule, rule_list, rule_lock);
if (rc)
                        goto out;
@@ -636,21 +609,23 @@ static void smk_rule_show(struct seq_file *s, struct 
smack_rule *srp, int max)
static void *load2_seq_start(struct seq_file *s, loff_t *pos)
  {
-       return smk_seq_start(s, pos, &smack_rule_list);
+       return smk_seq_start(s, pos, &smack_known_list);
  }
static void *load2_seq_next(struct seq_file *s, void *v, loff_t *pos)
  {
-       return smk_seq_next(s, v, pos, &smack_rule_list);
+       return smk_seq_next(s, v, pos, &smack_known_list);
  }
static int load_seq_show(struct seq_file *s, void *v)
  {
        struct list_head *list = v;
-       struct smack_master_list *smlp =
-               list_entry_rcu(list, struct smack_master_list, list);
+       struct smack_rule *srp;
+       struct smack_known *skp =
+               list_entry_rcu(list, struct smack_known, list);
- smk_rule_show(s, smlp->smk_rule, SMK_LABELLEN);
+       list_for_each_entry_rcu(srp, &skp->smk_rules, list)
+               smk_rule_show(s, srp, SMK_LABELLEN);
return 0;
  }
@@ -2352,10 +2327,12 @@ static ssize_t smk_write_access(struct file *file, 
const char __user *buf,
  static int load2_seq_show(struct seq_file *s, void *v)
  {
        struct list_head *list = v;
-       struct smack_master_list *smlp =
-               list_entry_rcu(list, struct smack_master_list, list);
+       struct smack_rule *srp;
+       struct smack_known *skp =
+               list_entry_rcu(list, struct smack_known, list);
- smk_rule_show(s, smlp->smk_rule, SMK_LONGLABEL);
+       list_for_each_entry_rcu(srp, &skp->smk_rules, list)
+               smk_rule_show(s, srp, SMK_LONGLABEL);
return 0;
  }

Reply via email to