Skip to content

Commit 1e76965

Browse files
committed
Merge tag 'for-linus-7.1-1' of https://github.com/cminyard/linux-ipmi
Pull ipmi updates from Corey Minyard: "Small updates and fixes (mostly to the BMC software): - Fix one issue in the host side driver where a kthread can be left running on a specific memory allocation failre at probe time - Replace system_wq with system_percpu_wq so system_wq can eventually go away" * tag 'for-linus-7.1-1' of https://github.com/cminyard/linux-ipmi: ipmi:ssif: Clean up kthread on errors ipmi:ssif: Remove unnecessary indention ipmi: ssif_bmc: Fix KUnit test link failure when KUNIT=m ipmi: ssif_bmc: add unit test for state machine ipmi: ssif_bmc: change log level to dbg in irq callback ipmi: ssif_bmc: fix message desynchronization after truncated response ipmi: ssif_bmc: fix missing check for copy_to_user() partial failure ipmi: ssif_bmc: cancel response timer on remove ipmi: Replace use of system_wq with system_percpu_wq
2 parents df8f618 + 75c486c commit 1e76965

4 files changed

Lines changed: 435 additions & 31 deletions

File tree

drivers/char/ipmi/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,16 @@ config SSIF_IPMI_BMC
187187
The driver implements the BMC side of the SMBus system
188188
interface (SSIF).
189189

190+
config SSIF_IPMI_BMC_KUNIT_TEST
191+
bool "KUnit tests for SSIF IPMI BMC driver" if !KUNIT_ALL_TESTS
192+
depends on KUNIT=y
193+
depends on SSIF_IPMI_BMC
194+
default KUNIT_ALL_TESTS
195+
help
196+
This option builds unit tests that exercise the SSIF BMC state
197+
machine, including request handling, response transmission,
198+
and error paths such as aborted or truncated transfers.
199+
190200
config IPMB_DEVICE_INTERFACE
191201
tristate 'IPMB Interface handler'
192202
depends on I2C

drivers/char/ipmi/ipmi_msghandler.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,7 @@ static int deliver_response(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
987987
mutex_lock(&intf->user_msgs_mutex);
988988
list_add_tail(&msg->link, &intf->user_msgs);
989989
mutex_unlock(&intf->user_msgs_mutex);
990-
queue_work(system_wq, &intf->smi_work);
990+
queue_work(system_percpu_wq, &intf->smi_work);
991991
}
992992

993993
return rv;
@@ -4977,7 +4977,7 @@ void ipmi_smi_msg_received(struct ipmi_smi *intf,
49774977
if (run_to_completion)
49784978
smi_work(&intf->smi_work);
49794979
else
4980-
queue_work(system_wq, &intf->smi_work);
4980+
queue_work(system_percpu_wq, &intf->smi_work);
49814981
}
49824982
EXPORT_SYMBOL(ipmi_smi_msg_received);
49834983

@@ -4987,7 +4987,7 @@ void ipmi_smi_watchdog_pretimeout(struct ipmi_smi *intf)
49874987
return;
49884988

49894989
atomic_set(&intf->watchdog_pretimeouts_to_deliver, 1);
4990-
queue_work(system_wq, &intf->smi_work);
4990+
queue_work(system_percpu_wq, &intf->smi_work);
49914991
}
49924992
EXPORT_SYMBOL(ipmi_smi_watchdog_pretimeout);
49934993

@@ -5162,7 +5162,7 @@ static bool ipmi_timeout_handler(struct ipmi_smi *intf,
51625162
flags);
51635163
}
51645164

5165-
queue_work(system_wq, &intf->smi_work);
5165+
queue_work(system_percpu_wq, &intf->smi_work);
51665166

51675167
return need_timer;
51685168
}
@@ -5218,7 +5218,7 @@ static void ipmi_timeout(struct timer_list *unused)
52185218
if (atomic_read(&stop_operation))
52195219
return;
52205220

5221-
queue_work(system_wq, &ipmi_timer_work);
5221+
queue_work(system_percpu_wq, &ipmi_timer_work);
52225222
}
52235223

52245224
static void need_waiter(struct ipmi_smi *intf)

drivers/char/ipmi/ipmi_ssif.c

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,8 +1268,10 @@ static void shutdown_ssif(void *send_info)
12681268
ssif_info->stopping = true;
12691269
timer_delete_sync(&ssif_info->watch_timer);
12701270
timer_delete_sync(&ssif_info->retry_timer);
1271-
if (ssif_info->thread)
1271+
if (ssif_info->thread) {
12721272
kthread_stop(ssif_info->thread);
1273+
ssif_info->thread = NULL;
1274+
}
12731275
}
12741276

12751277
static void ssif_remove(struct i2c_client *client)
@@ -1658,6 +1660,7 @@ static int ssif_probe(struct i2c_client *client)
16581660
int len = 0;
16591661
int i;
16601662
u8 slave_addr = 0;
1663+
unsigned int thread_num;
16611664
struct ssif_addr_info *addr_info = NULL;
16621665

16631666
mutex_lock(&ssif_infos_mutex);
@@ -1876,22 +1879,17 @@ static int ssif_probe(struct i2c_client *client)
18761879
ssif_info->handlers.request_events = request_events;
18771880
ssif_info->handlers.set_need_watch = ssif_set_need_watch;
18781881

1879-
{
1880-
unsigned int thread_num;
1881-
1882-
thread_num = ((i2c_adapter_id(ssif_info->client->adapter)
1883-
<< 8) |
1884-
ssif_info->client->addr);
1885-
init_completion(&ssif_info->wake_thread);
1886-
ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info,
1887-
"kssif%4.4x", thread_num);
1888-
if (IS_ERR(ssif_info->thread)) {
1889-
rv = PTR_ERR(ssif_info->thread);
1890-
dev_notice(&ssif_info->client->dev,
1891-
"Could not start kernel thread: error %d\n",
1892-
rv);
1893-
goto out;
1894-
}
1882+
thread_num = ((i2c_adapter_id(ssif_info->client->adapter) << 8) |
1883+
ssif_info->client->addr);
1884+
init_completion(&ssif_info->wake_thread);
1885+
ssif_info->thread = kthread_run(ipmi_ssif_thread, ssif_info,
1886+
"kssif%4.4x", thread_num);
1887+
if (IS_ERR(ssif_info->thread)) {
1888+
rv = PTR_ERR(ssif_info->thread);
1889+
dev_notice(&ssif_info->client->dev,
1890+
"Could not start kernel thread: error %d\n",
1891+
rv);
1892+
goto out;
18951893
}
18961894

18971895
dev_set_drvdata(&ssif_info->client->dev, ssif_info);
@@ -1916,6 +1914,15 @@ static int ssif_probe(struct i2c_client *client)
19161914

19171915
out:
19181916
if (rv) {
1917+
/*
1918+
* If ipmi_register_smi() starts the interface, it will
1919+
* call shutdown and that will free the thread and set
1920+
* it to NULL. Otherwise it must be freed here.
1921+
*/
1922+
if (ssif_info->thread) {
1923+
kthread_stop(ssif_info->thread);
1924+
ssif_info->thread = NULL;
1925+
}
19191926
if (addr_info)
19201927
addr_info->client = NULL;
19211928

0 commit comments

Comments
 (0)