Michael S. Tsirkin
573a3228ca
virtio: acknowledge all features before access
...
commit 4fa59ede95 upstream.
The feature negotiation was designed in a way that
makes it possible for devices to know which config
fields will be accessed by drivers.
This is broken since commit 404123c2db ("virtio: allow drivers to
validate features") with fallout in at least block and net. We have a
partial work-around in commit 2f9a174f91 ("virtio: write back
F_VERSION_1 before validate") which at least lets devices find out which
format should config space have, but this is a partial fix: guests
should not access config space without acknowledging features since
otherwise we'll never be able to change the config space format.
To fix, split finalize_features from virtio_finalize_features and
call finalize_features with all feature bits before validation,
and then - if validation changed any bits - once again after.
Since virtio_finalize_features no longer writes out features
rename it to virtio_features_ok - since that is what it does:
checks that features are ok with the device.
As a side effect, this also reduces the amount of hypervisor accesses -
we now only acknowledge features once unless we are clearing any
features when validating (which is uncommon).
IRC I think that this was more or less always the intent in the spec but
unfortunately the way the spec is worded does not say this explicitly, I
plan to address this at the spec level, too.
Acked-by: Jason Wang <jasowang@redhat.com >
Cc: stable@vger.kernel.org
Fixes: 404123c2db ("virtio: allow drivers to validate features")
Fixes: 2f9a174f91 ("virtio: write back F_VERSION_1 before validate")
Cc: "Halil Pasic" <pasic@linux.ibm.com >
Signed-off-by: Michael S. Tsirkin <mst@redhat.com >
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org >
2022-03-16 14:16:02 +01:00
..
2021-04-14 08:42:06 +02:00
2021-04-07 15:00:07 +02:00
2020-10-29 17:22:59 -05:00
2021-05-14 09:50:05 +02:00
2021-05-14 09:50:31 +02:00
2021-07-14 16:56:37 +02:00
2020-10-29 17:22:59 -05:00
2021-08-08 09:05:22 +02:00
2021-06-16 12:01:44 +02:00
2022-03-16 14:15:59 +01:00
2021-05-11 14:47:14 +02:00
2020-10-25 14:51:49 -07:00
2021-03-30 14:32:06 +02:00
2021-04-21 13:00:56 +02:00
2021-04-21 13:00:55 +02:00
2021-11-26 10:39:08 +01:00
2021-09-15 09:50:26 +02:00
2021-03-25 09:04:14 +01:00
2021-12-01 09:19:10 +01:00
2021-08-26 08:35:42 -04:00
2021-03-04 11:38:14 +01:00
2021-09-08 08:49:01 +02:00
2021-09-18 13:40:13 +02:00
2022-02-01 17:25:43 +01:00
2021-03-09 11:11:13 +01:00
2021-12-08 09:03:20 +01:00
2022-03-11 12:11:52 +01:00
2021-07-14 16:56:53 +02:00
2021-06-03 09:00:45 +02:00
2021-01-12 20:18:17 +01:00
2022-01-27 10:54:08 +01:00
2021-11-21 13:46:35 +01:00
2020-11-19 08:55:44 -05:00
2021-08-04 12:46:41 +02:00
2022-01-27 10:53:54 +01:00
2021-09-03 10:09:31 +02:00
2022-03-11 12:11:49 +01:00
2021-03-30 14:32:05 +02:00
2020-12-11 14:02:14 -08:00
2020-10-25 14:51:49 -07:00
2021-09-26 14:08:59 +02:00
2021-11-18 14:04:32 +01:00
2022-01-27 10:54:05 +01:00
2020-10-25 14:51:49 -07:00
2021-07-20 16:05:46 +02:00
2021-07-20 16:05:46 +02:00
2021-07-20 16:05:46 +02:00
2021-09-30 10:11:07 +02:00
2021-05-26 12:06:56 +02:00
2021-11-18 14:03:49 +01:00
2021-06-03 09:00:45 +02:00
2021-05-28 13:17:43 +02:00
2020-10-25 14:51:49 -07:00
2020-11-10 18:31:17 +01:00
2021-05-19 10:13:18 +02:00
2021-09-08 08:49:00 +02:00
2021-03-09 11:11:13 +01:00
2021-06-30 08:47:18 -04:00
2020-10-30 08:37:39 +01:00
2021-03-30 14:32:06 +02:00
2021-08-18 08:59:17 +02:00
2021-01-19 18:27:22 +01:00
2021-05-07 11:04:32 +02:00
2020-10-25 14:51:49 -07:00
2021-03-11 14:17:27 +01:00
2021-03-25 09:04:18 +01:00
2021-05-19 10:13:13 +02:00
2021-10-27 09:56:51 +02:00
2021-09-15 09:50:37 +02:00
2021-03-17 17:06:36 +01:00
2021-11-18 14:04:25 +01:00
2021-09-18 13:40:21 +02:00
2021-03-04 11:38:41 +01:00
2020-10-25 14:51:49 -07:00
2021-04-07 15:00:11 +02:00
2021-11-18 14:03:42 +01:00
2020-10-25 14:51:49 -07:00
2022-01-20 09:17:49 +01:00
2021-11-26 10:39:22 +01:00
2021-09-08 08:48:59 +02:00
2020-12-30 11:54:18 +01:00
2022-02-01 17:25:48 +01:00
2020-11-12 13:59:04 -07:00
2022-01-27 10:54:16 +01:00
2021-06-18 10:00:04 +02:00
2021-09-15 09:50:25 +02:00
2021-07-25 14:36:18 +02:00
2021-09-18 13:40:36 +02:00
2021-09-18 13:40:36 +02:00
2021-05-19 10:12:54 +02:00
2021-03-04 11:38:46 +01:00
2021-03-30 14:31:57 +02:00
2021-08-18 08:59:13 +02:00
2020-10-25 14:51:49 -07:00
2020-10-25 14:51:49 -07:00
2021-09-18 13:40:14 +02:00
2020-10-25 14:51:49 -07:00
2020-11-04 10:22:56 -07:00
2020-11-04 08:52:46 -08:00
2021-05-14 09:50:32 +02:00
2021-12-01 09:19:10 +01:00
2021-03-04 11:38:46 +01:00
2021-08-18 08:59:15 +02:00
2020-11-30 12:21:31 +01:00
2020-11-19 22:38:29 -05:00
2020-10-29 13:17:58 -05:00
2021-01-09 13:46:23 +01:00
2021-11-18 14:03:56 +01:00
2020-10-25 14:51:49 -07:00
2021-03-04 11:37:50 +01:00
2021-03-04 11:37:59 +01:00
2021-03-04 11:38:46 +01:00
2021-03-04 11:38:20 +01:00
2021-12-08 09:03:20 +01:00
2021-02-07 15:37:17 +01:00
2021-06-16 12:01:46 +02:00
2021-11-18 14:03:37 +01:00
2021-02-03 23:28:40 +01:00
2021-09-30 10:11:04 +02:00
2021-09-15 09:50:41 +02:00
2021-09-15 09:50:41 +02:00
2021-09-15 09:50:41 +02:00
2021-11-18 14:03:36 +01:00
2021-11-18 14:03:36 +01:00
2021-04-21 13:01:00 +02:00
2021-10-09 14:40:56 +02:00
2022-01-05 12:40:29 +01:00
2022-02-23 12:00:56 +01:00
2021-09-22 12:27:59 +02:00
2021-03-17 17:06:25 +01:00
2021-03-04 11:38:21 +01:00
2021-06-03 09:00:45 +02:00
2021-06-23 14:42:49 +02:00
2021-06-30 08:47:27 -04:00
2021-06-30 08:47:26 -04:00
2021-03-30 14:32:06 +02:00
2022-01-27 10:53:44 +01:00
2020-10-28 14:08:54 +00:00
2020-10-25 14:51:49 -07:00
2021-08-18 08:59:17 +02:00
2021-03-30 14:32:07 +02:00
2021-07-19 09:44:51 +02:00
2022-02-23 12:01:02 +01:00
2020-10-30 12:57:39 +01:00
2020-10-30 12:57:39 +01:00
2022-02-16 12:54:18 +01:00
2020-11-30 10:52:22 -05:00
2021-05-19 10:13:02 +02:00
2020-11-22 10:48:22 -08:00
2021-02-07 15:37:16 +01:00
2020-10-25 14:51:49 -07:00
2021-07-19 09:44:39 +02:00
2021-03-09 11:11:13 +01:00
2021-09-03 10:09:21 +02:00
2021-06-30 08:47:29 -04:00
2021-09-22 12:28:00 +02:00
2021-05-19 10:13:01 +02:00
2021-05-19 10:13:01 +02:00
2021-11-21 13:46:36 +01:00
2020-10-25 14:51:49 -07:00
2022-02-01 17:25:45 +01:00
2020-11-09 18:12:34 +01:00
2022-02-08 18:30:35 +01:00
2021-03-30 14:32:05 +02:00
2021-09-03 10:09:28 +02:00
2021-05-14 09:50:14 +02:00
2022-01-27 10:54:17 +01:00
2021-05-19 10:12:51 +02:00
2021-11-18 14:04:29 +01:00
2021-07-14 16:55:58 +02:00
2020-10-25 14:51:49 -07:00
2020-12-30 11:53:56 +01:00
2022-02-05 12:37:55 +01:00
2022-02-05 12:37:55 +01:00
2021-06-23 14:42:45 +02:00
2021-04-07 15:00:13 +02:00
2021-09-18 13:40:19 +02:00
2020-10-28 11:41:15 -06:00
2021-06-30 08:47:27 -04:00
2021-11-18 14:04:22 +01:00
2021-01-09 13:46:24 +01:00
2022-02-23 12:01:00 +01:00
2021-11-18 14:03:36 +01:00
2020-12-30 11:53:42 +01:00
2021-11-18 14:04:27 +01:00
2021-03-17 17:06:34 +01:00
2020-10-25 14:51:49 -07:00
2020-10-29 13:17:58 -05:00
2021-12-08 09:03:23 +01:00
2021-09-22 12:27:58 +02:00
2021-08-04 12:46:44 +02:00
2021-05-14 09:50:46 +02:00
2021-06-23 14:42:44 +02:00
2020-10-25 14:51:49 -07:00
2021-09-03 10:09:30 +02:00
2021-09-03 10:09:30 +02:00
2021-03-30 14:31:53 +02:00
2021-03-30 14:31:53 +02:00
2021-09-03 10:09:25 +02:00
2021-03-17 17:06:34 +01:00
2022-02-16 12:54:22 +01:00
2021-07-25 14:36:17 +02:00
2021-07-25 14:36:18 +02:00
2021-05-07 11:04:32 +02:00
2021-01-17 14:16:59 +01:00
2022-03-02 11:42:47 +01:00
2021-09-26 14:08:59 +02:00
2021-03-25 09:04:16 +01:00
2021-09-16 12:51:23 +02:00
2022-03-08 19:09:34 +01:00
2021-11-18 14:04:11 +01:00
2021-11-26 10:39:14 +01:00
2020-12-30 11:53:42 +01:00
2021-07-14 16:55:46 +02:00
2021-05-14 09:50:18 +02:00
2021-03-04 11:37:36 +01:00
2021-05-14 09:50:18 +02:00
2021-03-30 14:31:51 +02:00
2021-05-14 09:50:31 +02:00
2021-02-17 11:02:28 +01:00
2021-03-25 09:04:14 +01:00
2021-03-17 17:06:19 +01:00
2021-09-08 08:49:00 +02:00
2021-03-30 14:32:03 +02:00
2022-03-16 14:16:02 +01:00
2021-12-29 12:25:56 +01:00
2022-03-16 14:16:01 +01:00
2021-02-10 09:29:21 +01:00
2021-12-14 11:32:39 +01:00
2021-04-07 15:00:06 +02:00
2021-03-07 12:34:15 +01:00