mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
Merge branch 'drivers-s390-net-enable-context_analysis'
Heiko Carstens says: ==================== drivers/s390/net: Enable CONTEXT_ANALYSIS Enable CONTEXT_ANALYSYS for drivers/s390/net. Static code checking for acquiring and releasing locks used to be done with sparse. That was removed with [1] and replaced with a clang based approach [2]. The new approach requires that each subsystem needs to be explicitly enabled for checking. Do that for drivers/s390/net. In order to avoid false positives due to conditional locking, disable context analysis for specific functions of the ctcm driver. All comments in ctcm indicate that the code should stay as it is, and that such warnings should be ignored. Disabling context analysis for specific functions keeps analysis enabled for the rest of a file. [1]5b63d0ae94("compiler-context-analysis: Remove Sparse support") [2]3269701cb2("compiler-context-analysis: Add infrastructure for Context Analysis with Clang") ==================== Link: https://patch.msgid.link/20260805145032.1409325-1-hca@linux.ibm.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
ab40240945
|
|
@ -3,6 +3,8 @@
|
|||
# S/390 network devices
|
||||
#
|
||||
|
||||
CONTEXT_ANALYSIS := y
|
||||
|
||||
ctcm-y += ctcm_main.o ctcm_fsms.o ctcm_mpc.o ctcm_sysfs.o ctcm_dbug.o
|
||||
obj-$(CONFIG_CTCM) += ctcm.o fsm.o
|
||||
obj-$(CONFIG_SMSGIUCV) += smsgiucv.o
|
||||
|
|
|
|||
|
|
@ -545,6 +545,7 @@ static void chx_rxidle(fsm_instance *fi, int event, void *arg)
|
|||
* arg Generic pointer, casted from channel * upon call.
|
||||
*/
|
||||
static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
int rc;
|
||||
|
|
@ -563,8 +564,6 @@ static void ctcm_chx_setmode(fsm_instance *fi, int event, void *arg)
|
|||
|
||||
if (event == CTC_EVENT_TIMER) /* only for timer not yet locked */
|
||||
spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
/* Such conditional locking is undeterministic in
|
||||
* static view. => ignore sparse warnings here. */
|
||||
|
||||
rc = ccw_device_start(ch->cdev, &ch->ccw[6], 0, 0xff, 0);
|
||||
if (event == CTC_EVENT_TIMER) /* see above comments */
|
||||
|
|
@ -648,6 +647,7 @@ static void ctcm_chx_start(fsm_instance *fi, int event, void *arg)
|
|||
* arg Generic pointer, casted from channel * upon call.
|
||||
*/
|
||||
static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
unsigned long saveflags = 0;
|
||||
|
|
@ -662,15 +662,12 @@ static void ctcm_chx_haltio(fsm_instance *fi, int event, void *arg)
|
|||
|
||||
if (event == CTC_EVENT_STOP) /* only for STOP not yet locked */
|
||||
spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
/* Such conditional locking is undeterministic in
|
||||
* static view. => ignore sparse warnings here. */
|
||||
oldstate = fsm_getstate(fi);
|
||||
fsm_newstate(fi, CTC_STATE_TERM);
|
||||
rc = ccw_device_halt(ch->cdev, 0);
|
||||
|
||||
if (event == CTC_EVENT_STOP)
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
/* see remark above about conditional locking */
|
||||
|
||||
if (rc != 0 && rc != -EBUSY) {
|
||||
fsm_deltimer(&ch->timer);
|
||||
|
|
@ -824,6 +821,7 @@ static void ctcm_chx_setuperr(fsm_instance *fi, int event, void *arg)
|
|||
* arg Generic pointer, casted from channel * upon call.
|
||||
*/
|
||||
static void ctcm_chx_restart(fsm_instance *fi, int event, void *arg)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
struct net_device *dev = ch->netdev;
|
||||
|
|
@ -842,9 +840,6 @@ static void ctcm_chx_restart(fsm_instance *fi, int event, void *arg)
|
|||
fsm_newstate(fi, CTC_STATE_STARTWAIT);
|
||||
if (event == CTC_EVENT_TIMER) /* only for timer not yet locked */
|
||||
spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
/* Such conditional locking is a known problem for
|
||||
* sparse because its undeterministic in static view.
|
||||
* Warnings should be ignored here. */
|
||||
rc = ccw_device_halt(ch->cdev, 0);
|
||||
if (event == CTC_EVENT_TIMER)
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
|
|
@ -999,6 +994,7 @@ static void ctcm_chx_txiniterr(fsm_instance *fi, int event, void *arg)
|
|||
* arg Generic pointer, casted from channel * upon call.
|
||||
*/
|
||||
static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
struct net_device *dev = ch->netdev;
|
||||
|
|
@ -1042,9 +1038,6 @@ static void ctcm_chx_txretry(fsm_instance *fi, int event, void *arg)
|
|||
fsm_addtimer(&ch->timer, 1000, CTC_EVENT_TIMER, ch);
|
||||
if (event == CTC_EVENT_TIMER) /* for TIMER not yet locked */
|
||||
spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
/* Such conditional locking is a known problem for
|
||||
* sparse because its undeterministic in static view.
|
||||
* Warnings should be ignored here. */
|
||||
if (do_debug_ccw)
|
||||
ctcmpc_dumpit((char *)&ch->ccw[3],
|
||||
sizeof(struct ccw1) * 3);
|
||||
|
|
@ -1383,6 +1376,7 @@ static void ctcmpc_chx_txdone(fsm_instance *fi, int event, void *arg)
|
|||
* arg Generic pointer, casted from channel * upon call.
|
||||
*/
|
||||
static void ctcmpc_chx_rx(fsm_instance *fi, int event, void *arg)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
struct net_device *dev = ch->netdev;
|
||||
|
|
@ -1462,7 +1456,7 @@ static void ctcmpc_chx_rx(fsm_instance *fi, int event, void *arg)
|
|||
spin_lock_irqsave(
|
||||
get_ccwdev_lock(ch->cdev), saveflags);
|
||||
rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
|
||||
if (dolock) /* see remark about conditional locking */
|
||||
if (dolock)
|
||||
spin_unlock_irqrestore(
|
||||
get_ccwdev_lock(ch->cdev), saveflags);
|
||||
if (rc != 0)
|
||||
|
|
@ -1539,6 +1533,7 @@ static void ctcmpc_chx_firstio(fsm_instance *fi, int event, void *arg)
|
|||
* arg Generic pointer, casted from channel * upon call.
|
||||
*/
|
||||
void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
struct net_device *dev = ch->netdev;
|
||||
|
|
@ -1566,7 +1561,6 @@ void ctcmpc_chx_rxidle(fsm_instance *fi, int event, void *arg)
|
|||
ch->ccw[1].count = ch->max_bufsize;
|
||||
CTCM_CCW_DUMP((char *)&ch->ccw[0], sizeof(struct ccw1) * 3);
|
||||
if (event == CTC_EVENT_START)
|
||||
/* see remark about conditional locking */
|
||||
spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
rc = ccw_device_start(ch->cdev, &ch->ccw[0], 0, 0xff, 0);
|
||||
if (event == CTC_EVENT_START)
|
||||
|
|
|
|||
|
|
@ -1647,6 +1647,7 @@ static int mpc_validate_xid(struct mpcg_info *mpcginfo)
|
|||
* CTCM_PROTO_MPC only
|
||||
*/
|
||||
static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
|
||||
__context_unsafe(/* Conditional locking */)
|
||||
{
|
||||
struct channel *ch = arg;
|
||||
int rc = 0;
|
||||
|
|
@ -1774,9 +1775,6 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
|
|||
CTCM_D3_DUMP((char *)ch->xid_id, 4);
|
||||
|
||||
if (!in_hardirq()) {
|
||||
/* Such conditional locking is a known problem for
|
||||
* sparse because its static undeterministic.
|
||||
* Warnings should be ignored here. */
|
||||
spin_lock_irqsave(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
gotlock = 1;
|
||||
}
|
||||
|
|
@ -1784,7 +1782,7 @@ static void mpc_action_side_xid(fsm_instance *fsm, void *arg, int side)
|
|||
fsm_addtimer(&ch->timer, 5000 , CTC_EVENT_TIMER, ch);
|
||||
rc = ccw_device_start(ch->cdev, &ch->ccw[8], 0, 0xff, 0);
|
||||
|
||||
if (gotlock) /* see remark above about conditional locking */
|
||||
if (gotlock)
|
||||
spin_unlock_irqrestore(get_ccwdev_lock(ch->cdev), saveflags);
|
||||
|
||||
if (rc != 0) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user