From nobody Sun Feb 8 17:37:29 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 14B50A23 for ; Thu, 21 Mar 2024 01:25:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710984302; cv=none; b=OdZxmq7aL5XDbZjKwjXFum2SVaxKFB5Dpb1AOVGT8O7R91VJ7Fv4atZ6/qYp6v0TptuBzsLdB2WMH2gA67YpjnUiTDIwlRA8kVmWKey/cf9eKMazptegfyTYC2JFDAjWDKhf6bUJKmSfPOpGt1Zb2MqoaRDXh+62/4zvXNK+zuc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710984302; c=relaxed/simple; bh=9qViWAiTCFIgFNI104sEmf2/03Isba6KDxtepjBz+As=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X+58foXntgmMzdQgevxkQxwVa+pOt6S/WkZPo/CrlMuy21BKwaInmO7KDLw9Qu2TzMcQGe0SuPQAE7J1hR7ox0DXX28pwWlsphPaQmVgWTiX+U/7qSyGWBWDok2KdOYVOqWwVsBdw6jxfhyaqHhriuXjXrNuqkaHfXNpCzgZtpc= 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=NPsYVdv5; arc=none smtp.client-ip=209.85.216.41 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="NPsYVdv5" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-29c71c6e20cso397714a91.2 for ; Wed, 20 Mar 2024 18:25:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1710984300; x=1711589100; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LKMmiCHffcx2ZBQ5QrgfnTfmU8fHpt/uWul6SXcgwsw=; b=NPsYVdv5ewrNjIeTuHT/9oE5j9Vr8nNZ8FDWIJNoXRaDE13ceyha6MJ/NwA1evtWgr +6aX+zgDXftSSrnjC4AMAQwl0dWx/vUxGlAFcvFQENvIS2Slkk0KPkMPAIDSknXr2wnm 4WbayPlxxcmIzSX27TVtrOCGkjeuC6YsDf6cY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710984300; x=1711589100; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LKMmiCHffcx2ZBQ5QrgfnTfmU8fHpt/uWul6SXcgwsw=; b=E2NDvx0RLWmtxRIWOyLbRBRFgb4kwV+m+ZXuj079MCqvHFhrMG/xwry/QP9H0tPpgx WetRkVvJosASJTyHu2WfZ5G+nnZ7cS76qVjan/NxzCBtdnPif3vgzb4Ar+IYkSljdoLv Dk5qvuSwWvSVCdH8fIIcyLUZ1Z1qm3LQhU7PYnJdLk8MQ1Z9B4DACq1QDRQD3YnpePw3 xpghuqxADy474aUo6rDWQ+P4kBnPsWl/y0G+8Ei1siW9M6TOJyo8dvN24QHajLTgWJ16 ErUDoQdNwbgijl5cKrVzuW9w+KC53hGjWx8l59Y7Ln23P2BT2DvebP+iR68hPCI9DmgK trOw== X-Forwarded-Encrypted: i=1; AJvYcCXCL0YWyKFjDygWwwvRoewOk9aSfa7v6LhXX5uGtKdk9gIla2FtW9/Nj/cFjmBMsizmHJvHk+zO8ryEEFF9AKfKtwSqQUJ4hG5WrYjr X-Gm-Message-State: AOJu0YyR00pmBIc5vGJBD84hX5LTlm+eTQ1cH2Yhoiy8fM8D2TTRnqjm arlnC9izEErQDo7xNucZIOfdFLMx+zP05tHS8218i6oGaczcUTYa/olDwlbdIA== X-Google-Smtp-Source: AGHT+IFblfDsuIjIHTVJCb0dAYrbnIzAn8PgVyToCqQbTiekWIhtFt694PRGUKrwdZCzQZU0XxixSQ== X-Received: by 2002:a17:90b:4cc3:b0:29c:7620:6fde with SMTP id nd3-20020a17090b4cc300b0029c76206fdemr746531pjb.36.1710984300365; Wed, 20 Mar 2024 18:25:00 -0700 (PDT) Received: from localhost ([2401:fa00:8f:203:d837:1d3e:d3cd:7674]) by smtp.gmail.com with UTF8SMTPSA id sw15-20020a17090b2c8f00b0029bc2b845c4sm2309353pjb.11.2024.03.20.18.24.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 20 Mar 2024 18:25:00 -0700 (PDT) From: David Stevens X-Google-Original-From: David Stevens To: "Michael S . Tsirkin" , David Hildenbrand Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, David Stevens Subject: [PATCH v2 1/2] virtio_balloon: Give the balloon its own wakeup source Date: Thu, 21 Mar 2024 10:24:44 +0900 Message-ID: <20240321012445.1593685-2-stevensd@google.com> X-Mailer: git-send-email 2.44.0.291.gc1ea87d7ee-goog In-Reply-To: <20240321012445.1593685-1-stevensd@google.com> References: <20240321012445.1593685-1-stevensd@google.com> 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" From: David Stevens Wakeup sources don't support nesting multiple events, so sharing a single object between multiple drivers can result in one driver overriding the wakeup event processing period specified by another driver. Have the virtio balloon driver use the wakeup source of the device it is bound to rather than the wakeup source of the parent device, to avoid conflicts with the transport layer. Note that although the virtio balloon's virtio_device itself isn't what actually wakes up the device, it is responsible for processing wakeup events. In the same way that EPOLLWAKEUP uses a dedicated wakeup_source to prevent suspend when userspace is processing wakeup events, a dedicated wakeup_source is necessary when processing wakeup events in a higher layer in the kernel. Fixes: b12fbc3f787e ("virtio_balloon: stay awake while adjusting balloon") Signed-off-by: David Stevens Acked-by: David Hildenbrand --- drivers/virtio/virtio_balloon.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloo= n.c index 1f5b3dd31fcf..89bc8da80519 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -450,7 +450,7 @@ static void start_update_balloon_size(struct virtio_bal= loon *vb) vb->adjustment_signal_pending =3D true; if (!vb->adjustment_in_progress) { vb->adjustment_in_progress =3D true; - pm_stay_awake(vb->vdev->dev.parent); + pm_stay_awake(&vb->vdev->dev); } spin_unlock_irqrestore(&vb->adjustment_lock, flags); =20 @@ -462,7 +462,7 @@ static void end_update_balloon_size(struct virtio_ballo= on *vb) spin_lock_irq(&vb->adjustment_lock); if (!vb->adjustment_signal_pending && vb->adjustment_in_progress) { vb->adjustment_in_progress =3D false; - pm_relax(vb->vdev->dev.parent); + pm_relax(&vb->vdev->dev); } spin_unlock_irq(&vb->adjustment_lock); } @@ -1029,6 +1029,15 @@ static int virtballoon_probe(struct virtio_device *v= dev) =20 spin_lock_init(&vb->adjustment_lock); =20 + /* + * The virtio balloon itself can't wake up the device, but it is + * responsible for processing wakeup events passed up from the transport + * layer. Wakeup sources don't support nesting/chaining calls, so we use + * our own wakeup source to ensure wakeup events are properly handled + * without trampling on the transport layer's wakeup source. + */ + device_set_wakeup_capable(&vb->vdev->dev, true); + virtio_device_ready(vdev); =20 if (towards_target(vb)) --=20 2.44.0.291.gc1ea87d7ee-goog From nobody Sun Feb 8 17:37:29 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 92DAB4A2F for ; Thu, 21 Mar 2024 01:25:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710984306; cv=none; b=qPJTx0uurhi084Znj+/Qp/E1gTj3w6C+JQsy77VpXc57tIIPzV9pGZ92H3qEa5esxFQV0pckiJMY2RXTNGXXdZOETY5UKp3ENGkG5s0e0Vyim/4XDr7QomcFVIY7W4B4hDfN6bXexZ19GpGUu788t+ALJcRe5n4PJW/1w8WtQSM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1710984306; c=relaxed/simple; bh=wpS8fm0Fo8ZsmPmoFGOQ3aNztiAVNXAi///YoP3asEk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RtTBwLsa7SPWV5FA5S+fZ7AgY7J0QtgJJCC8xyLii6vM+WK8mLWl2WzASHshOUGIWH6o/kO3w6HintZb/208IU2DGgA3gv/1iQUnyIKpio0tpJGpFXZns3bxkSOTzuBKb4fdARNcalOiAoZQm9U1B62ZkG0cAo/IowSBXB0etoI= 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=WP+NoHFB; arc=none smtp.client-ip=209.85.214.178 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="WP+NoHFB" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-1dffa5e3f2dso2787755ad.2 for ; Wed, 20 Mar 2024 18:25:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1710984304; x=1711589104; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8bwghl2kBHBb0RS0OTenXBt5Ga/ttCmAZ1ErfJHsePc=; b=WP+NoHFBylwUVaAEId2rVeJ50Dvwv/WxU0UAZIrzWKOrJkFip+WGWjOOGWgzrT7MFs +brKyvjSUhtdpVyI3uHvdInKJMlCa3jrfBZI6saYDY3egOHaslinTuv/yKs2/7R/1dMH bjev3JI+k1XBOu252LrbK4KHRqQKicEtQ2aK8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710984304; x=1711589104; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8bwghl2kBHBb0RS0OTenXBt5Ga/ttCmAZ1ErfJHsePc=; b=ZAJMsXyRWTW82/iECIUh+0V0Fy5YG/6qpAxnTe7m8VWpWVAlA7JGthYJ1/D+kCiElg s87NDlzsjYL3Ix7pysly8A/yH6mOgLXmRjnzS9o4W0ANNSWKDIZtmqD5KjseySBoQ+zo vQpVPRcRfb9GdJeQS3JGlFMAOGaKD0lkdQX4bx/Lb5159TmXi3wXfGgfWG84OLg6lVER JCMkVCiZ7JYsMftXG8ELTA40tHx5BWN+EllLpZPFld29i8I0nKXbSvlA9NlZBHspeQeK pjKBxFE3YJ24f+2vyx2R0u6ikiSVO2+YOkrzHGzwseD4+xglk8kaJRDWokdUXeX0jXo5 uNMQ== X-Forwarded-Encrypted: i=1; AJvYcCWpD2fT+Ig1enUjwbn+uwmV1tAGZW15cIi7AFYZ9ZnMFnMcjhK/98ioVerecn9jaGEdnY8XbyyhECDb6rK0NCGNqqJGX9ddiU6QTiwh X-Gm-Message-State: AOJu0YwdFcRG2GXPoVII08N5+n7ZRkwfQEeBkz1hFDayT9rIRycM4kAM NL+9owvHjYFrUp5Gto8dUrS7/zyyn2ngNaI7LZZSKKCv25UZSHU3HzNlQEhGImS4jFuGPtkBABQ = X-Google-Smtp-Source: AGHT+IFZHrEsSnSQLHK7vl91mKd0fj+nzVpmHYMY60a4WFFk+eLOrsMqyzek1/2wU1jM5XYbDU4/rg== X-Received: by 2002:a17:902:e5c8:b0:1de:f29e:d7b with SMTP id u8-20020a170902e5c800b001def29e0d7bmr8585541plf.64.1710984303775; Wed, 20 Mar 2024 18:25:03 -0700 (PDT) Received: from localhost ([2401:fa00:8f:203:d837:1d3e:d3cd:7674]) by smtp.gmail.com with UTF8SMTPSA id v2-20020a170903238200b001dc3c4e7a12sm14411710plh.14.2024.03.20.18.25.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 20 Mar 2024 18:25:03 -0700 (PDT) From: David Stevens X-Google-Original-From: David Stevens To: "Michael S . Tsirkin" , David Hildenbrand Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, David Stevens Subject: [PATCH v2 2/2] virtio_balloon: Treat stats requests as wakeup events Date: Thu, 21 Mar 2024 10:24:45 +0900 Message-ID: <20240321012445.1593685-3-stevensd@google.com> X-Mailer: git-send-email 2.44.0.291.gc1ea87d7ee-goog In-Reply-To: <20240321012445.1593685-1-stevensd@google.com> References: <20240321012445.1593685-1-stevensd@google.com> 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" From: David Stevens Treat stats requests as wakeup events to ensure that the driver responds to device requests in a timely manner. Signed-off-by: David Stevens Acked-by: David Hildenbrand --- drivers/virtio/virtio_balloon.c | 75 ++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloo= n.c index 89bc8da80519..b09e8e3c62e5 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -121,11 +121,14 @@ struct virtio_balloon { struct page_reporting_dev_info pr_dev_info; =20 /* State for keeping the wakeup_source active while adjusting the balloon= */ - spinlock_t adjustment_lock; - bool adjustment_signal_pending; - bool adjustment_in_progress; + spinlock_t wakeup_lock; + bool processing_wakeup_event; + u32 wakeup_signal_mask; }; =20 +#define VIRTIO_BALLOON_WAKEUP_SIGNAL_ADJUST (1 << 0) +#define VIRTIO_BALLOON_WAKEUP_SIGNAL_STATS (1 << 1) + static const struct virtio_device_id id_table[] =3D { { VIRTIO_ID_BALLOON, VIRTIO_DEV_ANY_ID }, { 0 }, @@ -140,6 +143,36 @@ static u32 page_to_balloon_pfn(struct page *page) return pfn * VIRTIO_BALLOON_PAGES_PER_PAGE; } =20 +static void start_wakeup_event(struct virtio_balloon *vb, u32 mask) +{ + unsigned long flags; + + spin_lock_irqsave(&vb->wakeup_lock, flags); + vb->wakeup_signal_mask |=3D mask; + if (!vb->processing_wakeup_event) { + vb->processing_wakeup_event =3D true; + pm_stay_awake(&vb->vdev->dev); + } + spin_unlock_irqrestore(&vb->wakeup_lock, flags); +} + +static void process_wakeup_event(struct virtio_balloon *vb, u32 mask) +{ + spin_lock_irq(&vb->wakeup_lock); + vb->wakeup_signal_mask &=3D ~mask; + spin_unlock_irq(&vb->wakeup_lock); +} + +static void finish_wakeup_event(struct virtio_balloon *vb) +{ + spin_lock_irq(&vb->wakeup_lock); + if (!vb->wakeup_signal_mask && vb->processing_wakeup_event) { + vb->processing_wakeup_event =3D false; + pm_relax(&vb->vdev->dev); + } + spin_unlock_irq(&vb->wakeup_lock); +} + static void balloon_ack(struct virtqueue *vq) { struct virtio_balloon *vb =3D vq->vdev->priv; @@ -370,8 +403,10 @@ static void stats_request(struct virtqueue *vq) struct virtio_balloon *vb =3D vq->vdev->priv; =20 spin_lock(&vb->stop_update_lock); - if (!vb->stop_update) + if (!vb->stop_update) { + start_wakeup_event(vb, VIRTIO_BALLOON_WAKEUP_SIGNAL_STATS); queue_work(system_freezable_wq, &vb->update_balloon_stats_work); + } spin_unlock(&vb->stop_update_lock); } =20 @@ -444,29 +479,10 @@ static void virtio_balloon_queue_free_page_work(struc= t virtio_balloon *vb) =20 static void start_update_balloon_size(struct virtio_balloon *vb) { - unsigned long flags; - - spin_lock_irqsave(&vb->adjustment_lock, flags); - vb->adjustment_signal_pending =3D true; - if (!vb->adjustment_in_progress) { - vb->adjustment_in_progress =3D true; - pm_stay_awake(&vb->vdev->dev); - } - spin_unlock_irqrestore(&vb->adjustment_lock, flags); - + start_wakeup_event(vb, VIRTIO_BALLOON_WAKEUP_SIGNAL_ADJUST); queue_work(system_freezable_wq, &vb->update_balloon_size_work); } =20 -static void end_update_balloon_size(struct virtio_balloon *vb) -{ - spin_lock_irq(&vb->adjustment_lock); - if (!vb->adjustment_signal_pending && vb->adjustment_in_progress) { - vb->adjustment_in_progress =3D false; - pm_relax(&vb->vdev->dev); - } - spin_unlock_irq(&vb->adjustment_lock); -} - static void virtballoon_changed(struct virtio_device *vdev) { struct virtio_balloon *vb =3D vdev->priv; @@ -495,7 +511,10 @@ static void update_balloon_stats_func(struct work_stru= ct *work) =20 vb =3D container_of(work, struct virtio_balloon, update_balloon_stats_work); + + process_wakeup_event(vb, VIRTIO_BALLOON_WAKEUP_SIGNAL_STATS); stats_handle_request(vb); + finish_wakeup_event(vb); } =20 static void update_balloon_size_func(struct work_struct *work) @@ -506,9 +525,7 @@ static void update_balloon_size_func(struct work_struct= *work) vb =3D container_of(work, struct virtio_balloon, update_balloon_size_work); =20 - spin_lock_irq(&vb->adjustment_lock); - vb->adjustment_signal_pending =3D false; - spin_unlock_irq(&vb->adjustment_lock); + process_wakeup_event(vb, VIRTIO_BALLOON_WAKEUP_SIGNAL_ADJUST); =20 diff =3D towards_target(vb); =20 @@ -523,7 +540,7 @@ static void update_balloon_size_func(struct work_struct= *work) if (diff) queue_work(system_freezable_wq, work); else - end_update_balloon_size(vb); + finish_wakeup_event(vb); } =20 static int init_vqs(struct virtio_balloon *vb) @@ -1027,7 +1044,7 @@ static int virtballoon_probe(struct virtio_device *vd= ev) goto out_unregister_oom; } =20 - spin_lock_init(&vb->adjustment_lock); + spin_lock_init(&vb->wakeup_lock); =20 /* * The virtio balloon itself can't wake up the device, but it is --=20 2.44.0.291.gc1ea87d7ee-goog