From nobody Mon Sep 28 17:49:57 2026 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 37A75374E41 for ; Wed, 19 Aug 2026 02:35:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787106953; cv=none; b=lWI/56gRmNNFNJWeDhTCQVHLbjiW7bcMyMZe7rIbK8iY7bEuOGb3zh6zj2iVDDjq4cABZpkM9SRfrCTZHHXu8PDjCsVKVsxIRby12R8dMRAb/Xo6i/rHDz7KAKvYx84Dzra/pN47taq4/K9XLjkDiMqRM7aedTzU2/tsAwzUs0k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787106953; c=relaxed/simple; bh=MGB/mqhi8W6a1vzmw4ObUd0+yGy1NdQ8CGy/1K7LuuY=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=fCxBRanQkmzIswn9IrBrbc3/7jIxsJYfCwFgryfnA7yua/XxcG+J9DV5jRaI08ukLf29ADzCH9Sy0IXXlD+oEZ89l0aZRg2GCS5qfNPQaY78sq/DDtBuAcNvBpdLprJunCjl9KjsvkiqSIADg/W2f7XvuEl0y1CtM3VADKSwvL4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=OCeOqFKw; arc=none smtp.client-ip=209.85.215.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="OCeOqFKw" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-c96c92c0980so247950a12.3 for ; Tue, 18 Aug 2026 19:35:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1787106951; x=1787711751; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=fnopDGJQWguattVYFhYi/U/9aUtBjohp9pt2UySh4cA=; b=OCeOqFKwhvuloLwXuCiRpuqjOnCfpS940uzBShWk3MBM5NvfUccW9vfnfrgdGGto6D Kjs8xRIHA0hivx6+3CWNUJfzs8irZQjQonottL9oUF1XYQ/CHRf7tBSBaKdpUZyp+lfw 8B1LLrUp+2qneYeUPXQEBFBBT/pnTZUETsaUE= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787106951; x=1787711751; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=fnopDGJQWguattVYFhYi/U/9aUtBjohp9pt2UySh4cA=; b=RQnra8MycjZD+I0Ey+6TTQM7izm60HtY6V9cUWJGigfqbV7aAUsYz9VzzvkaMXsv1+ nRDKuZli0b/q4ecS7cQ1n+YZ7mGXaUkQt7UCkPmaSTQnBbD5B5iyOj4OQHrOtzJ4iKbU hofWjSFPAmh1GciGdRSWO6LZS9y2/1UrXnTvqc83KhogQDvVkA4dSTToRP/UleoEv1RC LOE+shT83qelgbpE74ZuBFjfeOgzWawBWK/cftr/RiXIf3/i5UD920KTSkOobz3eWC2Y Ln6RTdF37zHJZ+UKUtjBiDxrBEJAI9kCMX3J7VNs0BhNscET7HqOduRWOx23O9hW671T aW3Q== X-Forwarded-Encrypted: i=1; AHgh+RoZ9Kf/oIeR+Ytad4ant1Fa8/VDetYr/XEdnCNQE1WYp4OxG1ToXY9rp7ZM7kYEYfL7O3vig013saig/1k=@vger.kernel.org X-Gm-Message-State: AOJu0YyG14jFntZhZModSmGNxrdwyouNYPsP8QLDkoxspnLVY4dmxnIU t/gEZaN/Y1r2eeSHMg3eCk6rbkzcz066hrxIxoX9FlnUlbwEXTRRWbu6E3lV4Y+7Dw== X-Gm-Gg: AR+sD12VR6oUF5rXfh82/CB2l6YZTtiAV6wUeqUwpeR6pNMp2D4yU/DULR9p5Dheehn fbQ4z2F2rGchHnQaemy0PLNPlKiDFnA+naoro1QLnltAqEbn8Mz6s1xbSVFcvQnzR6scYxB4VdG moIXBfaDOPmxGqydJO1IIs9AIp8rpIYMxpNy0kmV2HUFqGduOFyoL29xUWN1zacZnctRIRegNrb vSbajGdcT+rebvYkqlslv4rlfVm73OxfcskSAxdgKwyZFdr1qU6zo4SLOGpmHDZIILF/nCXiNJ5 iVf4QMTq82J9pV+mSS/avTj7n1QEKx2CdEKGrBM66F8EP9Uj3c/EA014RCuJF8XgrEES95vVCEE KdHVNGmMiG9sVwh0w78WhccFQ/yy+IXV5XGzWaBe9diVl4POgaBxqa6LaDEO8Nap2YgqKRXtWc3 XiFBK6mvOkbBJyTfMZYEoAzdvkjNYSJE4Ijqi8ukZZjfIbCBOUeBEGLtpLwjaalV/Gdk/ZTjl2v t4JXj4NCnzj9X05v4mwZccsZYLiVvBGBDHBZKAlt5SS8ULf+Iah2fNZEH9e4j0= X-Received: by 2002:a17:90a:da90:b0:395:4de9:b30 with SMTP id 98e67ed59e1d1-39580a9aed7mr2767237a91.5.1787106951448; Tue, 18 Aug 2026 19:35:51 -0700 (PDT) Received: from tigeriii.tok.corp.google.com ([2a00:79e0:2031:6:cdd2:63a8:1c1b:5219]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-3957f95a68esm769082a91.0.2026.08.18.19.35.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Aug 2026 19:35:50 -0700 (PDT) From: Sergey Senozhatsky To: Miklos Szeredi Cc: fuse-devel@lists.linux.dev, linux-kernel@vger.kernel.org, Sergey Senozhatsky Subject: [PATCH v2] fuse: permit freezing while waiting for request answer Date: Wed, 19 Aug 2026 11:35:35 +0900 Message-ID: <20260819023542.561653-1-senozhatsky@chromium.org> X-Mailer: git-send-email 2.55.0.737.g08866a6d13-goog Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Suspend freezes tasks in random order and doesn't take into consideration producer-consumer dependency that may exist between tasks. One example where this can cause issues is: fuse server getting frozen ahead of clients, which then get stuck waiting for req answers that never come (the server is already frozen). Make all wait-event calls in request_wait_answer() freezer-friendly. This, however, doesn't address all cases. E.g. in-place PM-freeze of a request_wait_answer() task holding a contended VFS lock still will block suspend. Note: this uses TASK_FREEZABLE, not TASK_FREEZABLE_UNSAFE, which may trigger debug_locks warning during suspend (if request_wait_answer() task holds some locks at the time of freeze.) Signed-off-by: Sergey Senozhatsky --- fs/fuse/dev.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 34106f6e66a0..42098ddc2587 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -701,8 +701,9 @@ static void request_wait_answer(struct fuse_req *req) =20 if (!fch->no_interrupt) { /* Any signal may interrupt this */ - err =3D wait_event_interruptible(req->waitq, - test_bit(FR_FINISHED, &req->flags)); + err =3D wait_event_state(req->waitq, + test_bit(FR_FINISHED, &req->flags), + (TASK_INTERRUPTIBLE | TASK_FREEZABLE)); if (!err) return; =20 @@ -717,8 +718,9 @@ static void request_wait_answer(struct fuse_req *req) bool removed; =20 /* Only fatal signals may interrupt this */ - err =3D wait_event_killable(req->waitq, - test_bit(FR_FINISHED, &req->flags)); + err =3D wait_event_state(req->waitq, + test_bit(FR_FINISHED, &req->flags), + (TASK_KILLABLE | TASK_FREEZABLE)); if (!err) return; =20 @@ -740,7 +742,8 @@ static void request_wait_answer(struct fuse_req *req) * Either request is already in userspace, or it was forced. * Wait it out. */ - wait_event(req->waitq, test_bit(FR_FINISHED, &req->flags)); + wait_event_state(req->waitq, test_bit(FR_FINISHED, &req->flags), + (TASK_UNINTERRUPTIBLE | TASK_FREEZABLE)); } =20 static void __fuse_request_send(struct fuse_req *req) --=20 2.55.0.737.g08866a6d13-goog