The administrator sets the limit for the number of users by modifying
/sys/module/ipmi_msghandler/parameters/default_max_users.

Signed-off-by: Chen Guanqiao <chen.chencha...@foxmail.com>
---
 drivers/char/ipmi/ipmi_msghandler.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/drivers/char/ipmi/ipmi_msghandler.c 
b/drivers/char/ipmi/ipmi_msghandler.c
index c59265146e9c..7886c8337368 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -145,6 +145,12 @@ module_param(default_max_retries, uint, 0644);
 MODULE_PARM_DESC(default_max_retries,
                 "The time (milliseconds) between retry sends in maintenance 
mode");

+/* The default maximum number of users per intf */
+static unsigned int default_max_users = 50;
+module_param(default_max_users, uint, 0644);
+MODULE_PARM_DESC(default_max_users,
+                "The maximum number of users per interface");
+
 /* Call every ~1000 ms. */
 #define IPMI_TIMEOUT_TIME      1000

@@ -579,6 +585,9 @@ struct ipmi_smi {

        atomic_t stats[IPMI_NUM_STATS];

+       /* The number of user in this interface */
+       atomic_t user_count;
+
        /*
         * run_to_completion duplicate of smb_info, smi_info
         * and ipmi_serial_info structures. Used to decrease numbers of
@@ -1182,9 +1191,11 @@ static void free_user_work(struct work_struct *work)
 {
        struct ipmi_user *user = container_of(work, struct ipmi_user,
                                              remove_work);
+       struct ipmi_smi *intf = user->intf;

        cleanup_srcu_struct(&user->release_barrier);
        vfree(user);
+       atomic_dec(&intf->user_count);
 }

 int ipmi_create_user(unsigned int          if_num,
@@ -1230,6 +1241,12 @@ int ipmi_create_user(unsigned int          if_num,
        goto out_kfree;

  found:
+       if (atomic_inc_return(&intf->user_count) > default_max_users) {
+               atomic_dec(&intf->user_count);
+               rv = -EBUSY;
+               goto out_kfree;
+       }
+
        INIT_WORK(&new_user->remove_work, free_user_work);

        rv = init_srcu_struct(&new_user->release_barrier);
@@ -3548,6 +3565,7 @@ int ipmi_add_smi(struct module         *owner,
        spin_lock_init(&intf->events_lock);
        spin_lock_init(&intf->watch_lock);
        atomic_set(&intf->event_waiters, 0);
+       atomic_set(&intf->user_count, 0);
        intf->ticks_to_req_ev = IPMI_REQUEST_EV_TIME;
        INIT_LIST_HEAD(&intf->waiting_events);
        intf->waiting_events_count = 0;
--
2.25.1



_______________________________________________
Openipmi-developer mailing list
Openipmi-developer@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openipmi-developer

Reply via email to