wifi: iwlwifi: mvm: limit pseudo-D3 to 60 seconds
authorJohannes Berg <johannes.berg@intel.com>
Mon, 5 Feb 2024 19:21:11 +0000 (21:21 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 8 Feb 2024 14:00:48 +0000 (15:00 +0100)
With unlimited pseudo-D3, we can get stuck here in the read if
the firmware never wakes up. All of our testing infrastructure
however will anyway give up after at most a minute, so there's
no value in that.

Limit this to about a minute to avoid getting stuck with the
RTNL held forever, which basically makes the machine unusable
and then we can't even understand what caused the failure.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240205211151.ca55b3a7fa8d.Id746846f187442ebc689416d2688f2bd9278c0e9@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index 994387eac6f709b9e207165d027f10c5fcc44b3e..af449cb9f9679ac1783c3af60c0b192b9beadf8d 100644 (file)
@@ -3389,6 +3389,7 @@ static ssize_t iwl_mvm_d3_test_read(struct file *file, char __user *user_buf,
                                    size_t count, loff_t *ppos)
 {
        struct iwl_mvm *mvm = file->private_data;
+       unsigned long end = jiffies + 60 * HZ;
        u32 pme_asserted;
 
        while (true) {
@@ -3402,6 +3403,12 @@ static ssize_t iwl_mvm_d3_test_read(struct file *file, char __user *user_buf,
 
                if (msleep_interruptible(100))
                        break;
+
+               if (time_is_before_jiffies(end)) {
+                       IWL_ERR(mvm,
+                               "ending pseudo-D3 with timeout after ~60 seconds\n");
+                       return -ETIMEDOUT;
+               }
        }
 
        return 0;