aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
authorLinus Torvalds <torvalds@linux-foundation.org>2026-06-25 09:00:53 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2026-06-25 09:00:53 -0700
commit504c8065288befdc8a89e98858ac563deae9d7ba (patch)
tree2bc88bc333aa750f17c4faf639c59566016782a5 /drivers
parentab9de95c9cf952332ab79453b4b5d1bfca8e514f (diff)
parentde9aa5ea2d9ea55234e78af1e6182979aa4f646a (diff)
downloadath-504c8065288befdc8a89e98858ac563deae9d7ba.tar.gz
Merge tag 'for-linus-7.2-1' of https://github.com/cminyard/linux-ipmi
Pull ipmi updates from Corey Minyard: "Lots of little tweaks. Nothing huge, the biggest issue was a possible refcount underflow that could cause a memory leak in some situations. Otherwise, fixing formatting and style things and some docs typos" * tag 'for-linus-7.2-1' of https://github.com/cminyard/linux-ipmi: docs: ipmi: Fix path of the "hotmod" module parameter ipmi: Drop unused assignment of platform_device_id driver data ipmi: si: Use platform_get_irq_optional() to retrieve interrupt ipmi: fix refcount leak in i_ipmi_request() ipmi:ssif: Drop unused assignment of platform_device_id driver data ipmi: Fix user refcount underflow in event delivery ipmi: Use named initializers for struct i2c_device_id ipmi: Use LIST_HEAD() to initialize on stack list head ipmi:kcs: Reduce the number of retries
Diffstat (limited to 'drivers')
-rw-r--r--drivers/char/ipmi/ipmb_dev_int.c4
-rw-r--r--drivers/char/ipmi/ipmi_ipmb.c4
-rw-r--r--drivers/char/ipmi/ipmi_kcs_sm.c2
-rw-r--r--drivers/char/ipmi/ipmi_msghandler.c24
-rw-r--r--drivers/char/ipmi/ipmi_si_platform.c11
-rw-r--r--drivers/char/ipmi/ipmi_ssif.c4
-rw-r--r--drivers/char/ipmi/ssif_bmc.c2
7 files changed, 27 insertions, 24 deletions
diff --git a/drivers/char/ipmi/ipmb_dev_int.c b/drivers/char/ipmi/ipmb_dev_int.c
index 2fe1d205ce4e8..680ff15c30ab9 100644
--- a/drivers/char/ipmi/ipmb_dev_int.c
+++ b/drivers/char/ipmi/ipmb_dev_int.c
@@ -353,8 +353,8 @@ static void ipmb_remove(struct i2c_client *client)
}
static const struct i2c_device_id ipmb_id[] = {
- { "ipmb-dev" },
- {}
+ { .name = "ipmb-dev" },
+ { }
};
MODULE_DEVICE_TABLE(i2c, ipmb_id);
diff --git a/drivers/char/ipmi/ipmi_ipmb.c b/drivers/char/ipmi/ipmi_ipmb.c
index 28818952a7a4b..1f1e5718f082e 100644
--- a/drivers/char/ipmi/ipmi_ipmb.c
+++ b/drivers/char/ipmi/ipmi_ipmb.c
@@ -566,8 +566,8 @@ MODULE_DEVICE_TABLE(of, of_ipmi_ipmb_match);
#endif
static const struct i2c_device_id ipmi_ipmb_id[] = {
- { DEVICE_NAME },
- {}
+ { .name = DEVICE_NAME },
+ { }
};
MODULE_DEVICE_TABLE(i2c, ipmi_ipmb_id);
diff --git a/drivers/char/ipmi/ipmi_kcs_sm.c b/drivers/char/ipmi/ipmi_kcs_sm.c
index efda90dcf5b3d..c89055db39e52 100644
--- a/drivers/char/ipmi/ipmi_kcs_sm.c
+++ b/drivers/char/ipmi/ipmi_kcs_sm.c
@@ -102,7 +102,7 @@ enum kcs_states {
/* Timeouts in microseconds. */
#define IBF_RETRY_TIMEOUT (5*USEC_PER_SEC)
#define OBF_RETRY_TIMEOUT (5*USEC_PER_SEC)
-#define MAX_ERROR_RETRIES 10
+#define MAX_ERROR_RETRIES 2
#define ERROR0_OBF_WAIT_JIFFIES (2*HZ)
struct si_sm_data {
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
index 869ac87a4b6ae..ab4c85f3d6fe8 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -1610,14 +1610,12 @@ int ipmi_set_gets_events(struct ipmi_user *user, bool val)
{
struct ipmi_smi *intf = user->intf;
struct ipmi_recv_msg *msg, *msg2;
- struct list_head msgs;
+ LIST_HEAD(msgs);
user = acquire_ipmi_user(user);
if (!user)
return -ENODEV;
- INIT_LIST_HEAD(&msgs);
-
mutex_lock(&intf->events_mutex);
if (user->gets_events == val)
goto out;
@@ -2347,6 +2345,10 @@ static int i_ipmi_request(struct ipmi_user *user,
if (smi_msg == NULL) {
if (!supplied_recv)
ipmi_free_recv_msg(recv_msg);
+ else if (recv_msg->user) {
+ atomic_dec(&recv_msg->user->nr_msgs);
+ kref_put(&recv_msg->user->refcount, free_ipmi_user);
+ }
return -ENOMEM;
}
}
@@ -2420,6 +2422,10 @@ out_err:
ipmi_free_smi_msg(smi_msg);
if (!supplied_recv)
ipmi_free_recv_msg(recv_msg);
+ else if (recv_msg->user) {
+ atomic_dec(&recv_msg->user->nr_msgs);
+ kref_put(&recv_msg->user->refcount, free_ipmi_user);
+ }
}
return rv;
}
@@ -3785,10 +3791,9 @@ static void cleanup_smi_msgs(struct ipmi_smi *intf)
struct seq_table *ent;
struct ipmi_smi_msg *msg;
struct list_head *entry;
- struct list_head tmplist;
+ LIST_HEAD(tmplist);
/* Clear out our transmit queues and hold the messages. */
- INIT_LIST_HEAD(&tmplist);
list_splice_tail(&intf->hp_xmit_msgs, &tmplist);
list_splice_tail(&intf->xmit_msgs, &tmplist);
@@ -4442,7 +4447,7 @@ static int handle_read_event_rsp(struct ipmi_smi *intf,
struct ipmi_smi_msg *msg)
{
struct ipmi_recv_msg *recv_msg, *recv_msg2;
- struct list_head msgs;
+ LIST_HEAD(msgs);
struct ipmi_user *user;
int rv = 0, deliver_count = 0;
@@ -4457,8 +4462,6 @@ static int handle_read_event_rsp(struct ipmi_smi *intf,
return 0;
}
- INIT_LIST_HEAD(&msgs);
-
mutex_lock(&intf->events_mutex);
ipmi_inc_stat(intf, events);
@@ -4477,10 +4480,8 @@ static int handle_read_event_rsp(struct ipmi_smi *intf,
mutex_unlock(&intf->users_mutex);
list_for_each_entry_safe(recv_msg, recv_msg2, &msgs,
link) {
- user = recv_msg->user;
list_del(&recv_msg->link);
ipmi_free_recv_msg(recv_msg);
- kref_put(&user->refcount, free_ipmi_user);
}
/*
* We couldn't allocate memory for the
@@ -5101,7 +5102,7 @@ static void check_msg_timeout(struct ipmi_smi *intf, struct seq_table *ent,
static bool ipmi_timeout_handler(struct ipmi_smi *intf,
unsigned long timeout_period)
{
- struct list_head timeouts;
+ LIST_HEAD(timeouts);
struct ipmi_recv_msg *msg, *msg2;
unsigned long flags;
int i;
@@ -5120,7 +5121,6 @@ static bool ipmi_timeout_handler(struct ipmi_smi *intf,
* have timed out, putting them in the timeouts
* list.
*/
- INIT_LIST_HEAD(&timeouts);
mutex_lock(&intf->seq_lock);
if (intf->ipmb_maintenance_mode_timeout) {
if (intf->ipmb_maintenance_mode_timeout <= timeout_period)
diff --git a/drivers/char/ipmi/ipmi_si_platform.c b/drivers/char/ipmi/ipmi_si_platform.c
index fb6e359ae4946..bdc481ce13028 100644
--- a/drivers/char/ipmi/ipmi_si_platform.c
+++ b/drivers/char/ipmi/ipmi_si_platform.c
@@ -276,7 +276,10 @@ static int of_ipmi_probe(struct platform_device *pdev)
io.regspacing = regspacing ? be32_to_cpup(regspacing) : DEFAULT_REGSPACING;
io.regshift = regshift ? be32_to_cpup(regshift) : 0;
- io.irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
+ io.irq = platform_get_irq_optional(pdev, 0);
+ if (io.irq < 0)
+ io.irq = 0;
+
io.dev = &pdev->dev;
dev_dbg(&pdev->dev, "addr 0x%lx regsize %d spacing %d irq %d\n",
@@ -433,9 +436,9 @@ void ipmi_remove_platform_device_by_name(char *name)
}
static const struct platform_device_id si_plat_ids[] = {
- { "dmi-ipmi-si", 0 },
- { "hardcode-ipmi-si", 0 },
- { "hotmod-ipmi-si", 0 },
+ { .name = "dmi-ipmi-si" },
+ { .name = "hardcode-ipmi-si" },
+ { .name = "hotmod-ipmi-si" },
{ }
};
diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c
index f419b46bf0020..07f1d2327bb74 100644
--- a/drivers/char/ipmi/ipmi_ssif.c
+++ b/drivers/char/ipmi/ipmi_ssif.c
@@ -2094,7 +2094,7 @@ static int dmi_ipmi_probe(struct platform_device *pdev)
#endif
static const struct i2c_device_id ssif_id[] = {
- { DEVICE_NAME },
+ { .name = DEVICE_NAME },
{ }
};
MODULE_DEVICE_TABLE(i2c, ssif_id);
@@ -2127,7 +2127,7 @@ static void ssif_platform_remove(struct platform_device *dev)
}
static const struct platform_device_id ssif_plat_ids[] = {
- { "dmi-ipmi-ssif", 0 },
+ { .name = "dmi-ipmi-ssif" },
{ }
};
MODULE_DEVICE_TABLE(platform, ssif_plat_ids);
diff --git a/drivers/char/ipmi/ssif_bmc.c b/drivers/char/ipmi/ssif_bmc.c
index 1df0e9284ad96..6036897725f3b 100644
--- a/drivers/char/ipmi/ssif_bmc.c
+++ b/drivers/char/ipmi/ssif_bmc.c
@@ -874,7 +874,7 @@ static const struct of_device_id ssif_bmc_match[] = {
MODULE_DEVICE_TABLE(of, ssif_bmc_match);
static const struct i2c_device_id ssif_bmc_id[] = {
- { DEVICE_NAME },
+ { .name = DEVICE_NAME },
{ }
};
MODULE_DEVICE_TABLE(i2c, ssif_bmc_id);