On Mon, Nov 08, 2021 at 12:19:15PM +0100, Laszlo Ersek wrote:
On 11/08/21 10:12, Richard W.M. Jones wrote:
> This was part of the old in-place support. When we add new in-place
> support we'll do something else, but currently this is dead code so
> remove it completely.
>
> Note this removes the code for installing the virtio-scsi driver (only
> ever using virtio-blk). This was also dead code in the current
> implementation of virt-v2v, but worth remembering in case we want to
> resurrect this feature in a future version.
> ---
> convert/convert.ml | 10 ++---
> convert/convert_linux.ml | 24 +++-------
> convert/convert_linux.mli | 2 +-
> convert/convert_windows.ml | 4 +-
> convert/convert_windows.mli | 2 +-
> convert/windows_virtio.ml | 87 ++++++-------------------------------
> convert/windows_virtio.mli | 9 +---
> lib/types.ml | 20 ---------
> lib/types.mli | 10 -----
> 9 files changed, 30 insertions(+), 138 deletions(-)
This is exactly the kind of enormous patch that I don't trust myself to
implement in a project I'm new to. It's difficult to find the boundaries
(= where we stop cutting), and also difficult to find everything that
becomes unused / dead after the removals. (For example, I had to check
that "string_of_video" remained in use, via a different call path.)
I also find reviewing this pretty hard. The patch modifies many
(arguably) disparate aspects that I can't *all* keep easily in mind
during review. I think I might have attempted a more bottom-up, gradual
elimination approach, but that's exactly because I must watch my step
very closely. I do think this patch is fine.
TBH I just chopped out every mention of rcaps / requested_guestcaps
over breakfast. The compiler is very good at finding mistakes in
these kinds of patches because it won't compile something unless all
parameters/function exactly match, all matches are complete, etc.
Old virt-v2v was written in Perl and that was dreadful for refactoring.
Thanks,
Rich.
Acked-by: Laszlo Ersek <lersek(a)redhat.com>
Thanks!
Laszlo
>
> diff --git a/convert/convert.ml b/convert/convert.ml
> index 07c7aee90..109e55284 100644
> --- a/convert/convert.ml
> +++ b/convert/convert.ml
> @@ -230,10 +230,7 @@ helper-v2v-convert V2VDIR
>
> (* Conversion. *)
> let guestcaps =
> - let rcaps = (*XXX*)
> - { rcaps_block_bus = None; rcaps_net_bus = None; rcaps_video = None } in
> -
> - do_convert g source inspect keep_serial_console rcaps static_ips in
> + do_convert g source inspect keep_serial_console static_ips in
>
> g#umount_all ();
>
> @@ -364,7 +361,7 @@ and do_fstrim g inspect =
> ) fses
>
> (* Conversion. *)
> -and do_convert g source inspect keep_serial_console rcaps interfaces =
> +and do_convert g source inspect keep_serial_console interfaces =
> (match inspect.i_product_name with
> | "unknown" ->
> message (f_"Converting the guest to run on KVM")
> @@ -388,9 +385,8 @@ and do_convert g source inspect keep_serial_console rcaps
interfaces =
> error (f_"virt-v2v is unable to convert this guest type (%s/%s)")
> inspect.i_type inspect.i_distro in
> debug "picked conversion module %s" conversion_name;
> - debug "requested caps: %s" (string_of_requested_guestcaps rcaps);
> let guestcaps =
> - convert g source inspect keep_serial_console rcaps interfaces in
> + convert g source inspect keep_serial_console interfaces in
> debug "%s" (string_of_guestcaps guestcaps);
>
> (* Did we manage to install virtio drivers? *)
> diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
> index 057cf9dff..b0b5d916d 100644
> --- a/convert/convert_linux.ml
> +++ b/convert/convert_linux.ml
> @@ -34,7 +34,7 @@ open Linux_kernels
> module G = Guestfs
>
> (* The conversion function. *)
> -let convert (g : G.guestfs) source inspect keep_serial_console rcaps _ =
> +let convert (g : G.guestfs) source inspect keep_serial_console _ =
> (*----------------------------------------------------------------------*)
> (* Inspect the guest first. We already did some basic inspection in
> * the common v2v.ml code, but that has to deal with generic guests
> @@ -111,22 +111,12 @@ let convert (g : G.guestfs) source inspect keep_serial_console
rcaps _ =
>
> let acpi = supports_acpi () in
>
> - let video =
> - match rcaps.rcaps_video with
> - | None -> QXL
> - | Some video -> video in
> -
> let block_type =
> - match rcaps.rcaps_block_bus with
> - | None -> if kernel.ki_supports_virtio_blk then Virtio_blk else IDE
> - | Some block_type -> block_type in
> -
> + if kernel.ki_supports_virtio_blk then Virtio_blk else IDE in
> let net_type =
> - match rcaps.rcaps_net_bus with
> - | None -> if kernel.ki_supports_virtio_net then Virtio_net else E1000
> - | Some net_type -> net_type in
> + if kernel.ki_supports_virtio_net then Virtio_net else E1000 in
>
> - configure_display_driver video;
> + configure_display_driver ();
> remap_block_devices block_type;
> configure_kernel_modules block_type net_type;
> rebuild_initrd kernel;
> @@ -158,7 +148,7 @@ let convert (g : G.guestfs) source inspect keep_serial_console
rcaps _ =
> let guestcaps = {
> gcaps_block_bus = block_type;
> gcaps_net_bus = net_type;
> - gcaps_video = video;
> + gcaps_video = QXL;
> gcaps_virtio_rng = kernel.ki_supports_virtio_rng;
> gcaps_virtio_balloon = kernel.ki_supports_virtio_balloon;
> gcaps_isa_pvpanic = kernel.ki_supports_isa_pvpanic;
> @@ -828,8 +818,8 @@ let convert (g : G.guestfs) source inspect keep_serial_console
rcaps _ =
> else
> true
>
> - and configure_display_driver video =
> - let video_driver = match video with QXL -> "qxl" | Cirrus ->
"cirrus" in
> + and configure_display_driver () =
> + let video_driver = "qxl" in
>
> let updated = ref false in
>
> diff --git a/convert/convert_linux.mli b/convert/convert_linux.mli
> index 8adc172a0..688a7acea 100644
> --- a/convert/convert_linux.mli
> +++ b/convert/convert_linux.mli
> @@ -23,5 +23,5 @@
> Mint and Kali are supported by this module. *)
>
> val convert : Guestfs.guestfs -> Types.source -> Types.inspect ->
> - bool -> Types.requested_guestcaps -> Types.static_ip list
->
> + bool -> Types.static_ip list ->
> Types.guestcaps
> diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
> index f2c1132bf..31e16723b 100644
> --- a/convert/convert_windows.ml
> +++ b/convert/convert_windows.ml
> @@ -38,7 +38,7 @@ module G = Guestfs
> * time the Windows VM is booted on KVM.
> *)
>
> -let convert (g : G.guestfs) _ inspect _ rcaps static_ips =
> +let convert (g : G.guestfs) _ inspect _ static_ips =
> (*----------------------------------------------------------------------*)
> (* Inspect the Windows guest. *)
>
> @@ -469,7 +469,7 @@ if errorlevel 3010 exit /b 0
> disable_xenpv_win_drivers reg;
> disable_prl_drivers reg;
> disable_autoreboot reg;
> - Windows_virtio.install_drivers reg inspect rcaps
> + Windows_virtio.install_drivers reg inspect
>
> and disable_xenpv_win_drivers reg =
> (* Disable xenpv-win service (RHBZ#809273). *)
> diff --git a/convert/convert_windows.mli b/convert/convert_windows.mli
> index d2978d6a4..d3ea3d6ae 100644
> --- a/convert/convert_windows.mli
> +++ b/convert/convert_windows.mli
> @@ -21,5 +21,5 @@
> This module converts a Windows guest to run on KVM. *)
>
> val convert : Guestfs.guestfs -> Types.source -> Types.inspect ->
> - bool -> Types.requested_guestcaps -> Types.static_ip list
->
> + bool -> Types.static_ip list ->
> Types.guestcaps
> diff --git a/convert/windows_virtio.ml b/convert/windows_virtio.ml
> index f843dae2d..08db4ad69 100644
> --- a/convert/windows_virtio.ml
> +++ b/convert/windows_virtio.ml
> @@ -44,31 +44,16 @@ let viostor_modern_pciid =
"VEN_1AF4&DEV_1042&SUBSYS_11001AF4&REV_01"
> let vioscsi_legacy_pciid =
"VEN_1AF4&DEV_1004&SUBSYS_00081AF4&REV_00"
> let vioscsi_modern_pciid =
"VEN_1AF4&DEV_1048&SUBSYS_11001AF4&REV_01"
>
> -let rec install_drivers ((g, _) as reg) inspect rcaps =
> +let rec install_drivers ((g, _) as reg) inspect =
> (* Copy the virtio drivers to the guest. *)
> let driverdir = sprintf "%s/Drivers/VirtIO"
inspect.i_windows_systemroot in
> g#mkdir_p driverdir;
>
> if not (copy_drivers g inspect driverdir) then (
> - match rcaps with
> - | { rcaps_block_bus = Some Virtio_blk | Some Virtio_SCSI }
> - | { rcaps_net_bus = Some Virtio_net }
> - | { rcaps_video = Some QXL } ->
> - error (f_"there are no virtio drivers available for this version of
Windows (%d.%d %s %s). virt-v2v looks for drivers in %s")
> - inspect.i_major_version inspect.i_minor_version inspect.i_arch
> - inspect.i_product_variant virtio_win
> -
> - | { rcaps_block_bus = (Some IDE | None);
> - rcaps_net_bus = ((Some E1000 | Some RTL8139 | None) as net_type);
> - rcaps_video = (Some Cirrus | None) } ->
> warning (f_"there are no virtio drivers available for this version of
Windows (%d.%d %s %s). virt-v2v looks for drivers in %s\n\nThe guest will be configured
to use slower emulated devices.")
> inspect.i_major_version inspect.i_minor_version inspect.i_arch
> inspect.i_product_variant virtio_win;
> - let net_type =
> - match net_type with
> - | Some model -> model
> - | None -> RTL8139 in
> - (IDE, net_type, Cirrus, false, false, false, false)
> + (IDE, RTL8139, Cirrus, false, false, false, false)
> )
> else (
> (* Can we install the block driver? *)
> @@ -83,25 +68,14 @@ let rec install_drivers ((g, _) as reg) inspect rcaps =
> ) filenames
> )
> ) with Not_found -> None in
> - let has_vioscsi = g#exists (driverdir // "vioscsi.inf") in
> - match rcaps.rcaps_block_bus, viostor_driver, has_vioscsi with
> - | Some Virtio_blk, None, _ ->
> - error (f_"there is no virtio block device driver for this version of
Windows (%d.%d %s). virt-v2v looks for this driver in %s\n\nThe guest will be configured
to use a slower emulated device.")
> - inspect.i_major_version inspect.i_minor_version
> - inspect.i_arch virtio_win
> -
> - | Some Virtio_SCSI, _, false ->
> - error (f_"there is no vioscsi (virtio SCSI) driver for this version of
Windows (%d.%d %s). virt-v2v looks for this driver in %s\n\nThe guest will be configured
to use a slower emulated device.")
> - inspect.i_major_version inspect.i_minor_version
> - inspect.i_arch virtio_win
> -
> - | None, None, _ ->
> + match viostor_driver with
> + | None ->
> warning (f_"there is no virtio block device driver for this version of
Windows (%d.%d %s). virt-v2v looks for this driver in %s\n\nThe guest will be configured
to use a slower emulated device.")
> inspect.i_major_version inspect.i_minor_version
> inspect.i_arch virtio_win;
> IDE
>
> - | (Some Virtio_blk | None), Some driver_name, _ ->
> + | Some driver_name ->
> (* Block driver needs tweaks to allow booting; the rest is set up by PnP
> * manager *)
> let source = driverdir // (driver_name ^ ".sys") in
> @@ -111,22 +85,7 @@ let rec install_drivers ((g, _) as reg) inspect rcaps =
> g#cp source target;
> add_guestor_to_registry reg inspect driver_name viostor_legacy_pciid;
> add_guestor_to_registry reg inspect driver_name viostor_modern_pciid;
> - Virtio_blk
> -
> - | Some Virtio_SCSI, _, true ->
> - (* Block driver needs tweaks to allow booting; the rest is set up by PnP
> - * manager *)
> - let source = driverdir // "vioscsi.sys" in
> - let target = sprintf "%s/system32/drivers/vioscsi.sys"
> - inspect.i_windows_systemroot in
> - let target = g#case_sensitive_path target in
> - g#cp source target;
> - add_guestor_to_registry reg inspect "vioscsi"
vioscsi_legacy_pciid;
> - add_guestor_to_registry reg inspect "vioscsi"
vioscsi_modern_pciid;
> - Virtio_SCSI
> -
> - | Some IDE, _, _ ->
> - IDE in
> + Virtio_blk in
>
> (* Can we install the virtio-net driver? *)
> let net : guestcaps_net_type =
> @@ -135,46 +94,28 @@ let rec install_drivers ((g, _) as reg) inspect rcaps =
> List.exists (
> fun driver_file -> g#exists (driverdir // driver_file)
> ) filenames in
> - match rcaps.rcaps_net_bus, has_netkvm with
> - | Some Virtio_net, false ->
> - error (f_"there is no virtio network driver for this version of
Windows (%d.%d %s). virt-v2v looks for this driver in %s")
> - inspect.i_major_version inspect.i_minor_version
> - inspect.i_arch virtio_win
> -
> - | None, false ->
> + if not has_netkvm then (
> warning (f_"there is no virtio network driver for this version of
Windows (%d.%d %s). virt-v2v looks for this driver in %s\n\nThe guest will be configured
to use a slower emulated device.")
> inspect.i_major_version inspect.i_minor_version
> inspect.i_arch virtio_win;
> RTL8139
> -
> - | (Some Virtio_net | None), true ->
> - Virtio_net
> -
> - | Some net_type, _ ->
> - net_type in
> + )
> + else
> + Virtio_net in
>
> (* Can we install the QXL driver? *)
> let video : guestcaps_video_type =
> let has_qxl =
> g#exists (driverdir // "qxl.inf") ||
> g#exists (driverdir // "qxldod.inf") in
> - match rcaps.rcaps_video, has_qxl with
> - | Some QXL, false ->
> - error (f_"there is no QXL driver for this version of Windows (%d.%d
%s). virt-v2v looks for this driver in %s")
> - inspect.i_major_version inspect.i_minor_version
> - inspect.i_arch virtio_win
> -
> - | None, false ->
> + if not has_qxl then (
> warning (f_"there is no QXL driver for this version of Windows (%d.%d
%s). virt-v2v looks for this driver in %s\n\nThe guest will be configured to use a basic
VGA display driver.")
> inspect.i_major_version inspect.i_minor_version
> inspect.i_arch virtio_win;
> Cirrus
> -
> - | (Some QXL | None), true ->
> - QXL
> -
> - | Some Cirrus, _ ->
> - Cirrus in
> + )
> + else
> + QXL in
>
> (* Did we install the miscellaneous drivers? *)
> let virtio_rng_supported = g#exists (driverdir // "viorng.inf") in
> diff --git a/convert/windows_virtio.mli b/convert/windows_virtio.mli
> index 642317b15..4e24625a4 100644
> --- a/convert/windows_virtio.mli
> +++ b/convert/windows_virtio.mli
> @@ -19,9 +19,9 @@
> (** Functions for installing Windows virtio drivers. *)
>
> val install_drivers
> - : Registry.t -> Types.inspect -> Types.requested_guestcaps ->
> + : Registry.t -> Types.inspect ->
> Types.guestcaps_block_type * Types.guestcaps_net_type *
Types.guestcaps_video_type * bool * bool * bool * bool
> -(** [install_drivers reg inspect rcaps]
> +(** [install_drivers reg inspect]
> installs virtio drivers from the driver directory or driver
> ISO into the guest driver directory and updates the registry
> so that the [viostor.sys] driver gets loaded by Windows at boot.
> @@ -29,11 +29,6 @@ val install_drivers
> [reg] is the system hive which is open for writes when this
> function is called.
>
> - [rcaps] is the set of guest "capabilities" requested by the caller.
This
> - may include the type of the block driver, network driver, and video driver.
> - install_drivers will adjust its choices based on that information, and
> - abort if the requested driver wasn't found.
> -
> This returns the tuple [(block_driver, net_driver, video_driver,
> virtio_rng_supported, virtio_ballon_supported, isa_pvpanic_supported)]
> reflecting what devices are now required by the guest, either
> diff --git a/lib/types.ml b/lib/types.ml
> index 72d10d1ec..9be3e6fcd 100644
> --- a/lib/types.ml
> +++ b/lib/types.ml
> @@ -422,11 +422,6 @@ type guestcaps = {
> gcaps_arch : string;
> gcaps_acpi : bool;
> }
> -and requested_guestcaps = {
> - rcaps_block_bus : guestcaps_block_type option;
> - rcaps_net_bus : guestcaps_net_type option;
> - rcaps_video : guestcaps_video_type option;
> -}
> and guestcaps_block_type = Virtio_blk | Virtio_SCSI | IDE
> and guestcaps_net_type = Virtio_net | E1000 | RTL8139
> and guestcaps_video_type = QXL | Cirrus
> @@ -463,21 +458,6 @@ gcaps_acpi = %b
> gcaps.gcaps_arch
> gcaps.gcaps_acpi
>
> -let string_of_requested_guestcaps rcaps =
> - sprintf "\
> -rcaps_block_bus = %s
> -rcaps_net_bus = %s
> -rcaps_video = %s
> -" (match rcaps.rcaps_block_bus with
> - | None -> "unspecified"
> - | Some block_type -> (string_of_block_type block_type))
> - (match rcaps.rcaps_net_bus with
> - | None -> "unspecified"
> - | Some net_type -> (string_of_net_type net_type))
> - (match rcaps.rcaps_video with
> - | None -> "unspecified"
> - | Some video -> (string_of_video video))
> -
> type target_buses = {
> target_virtio_blk_bus : target_bus_slot array;
> target_ide_bus : target_bus_slot array;
> diff --git a/lib/types.mli b/lib/types.mli
> index 0bae445d8..4d4049605 100644
> --- a/lib/types.mli
> +++ b/lib/types.mli
> @@ -282,22 +282,12 @@ type guestcaps = {
> }
> (** Guest capabilities after conversion. eg. Was virtio found or installed? *)
>
> -and requested_guestcaps = {
> - rcaps_block_bus : guestcaps_block_type option;
> - rcaps_net_bus : guestcaps_net_type option;
> - rcaps_video : guestcaps_video_type option;
> -}
> -(** For [--in-place] conversions, the requested guest capabilities, to
> - allow the caller to affect conversion choices. [None] = no
> - preference, use the best available. *)
> -
> and guestcaps_block_type = Virtio_blk | Virtio_SCSI | IDE
> and guestcaps_net_type = Virtio_net | E1000 | RTL8139
> and guestcaps_video_type = QXL | Cirrus
> and guestcaps_machine = I440FX | Q35 | Virt
>
> val string_of_guestcaps : guestcaps -> string
> -val string_of_requested_guestcaps : requested_guestcaps -> string
>
> (** {2 Guest buses} *)
>
>
--
Richard Jones, Virtualization Group, Red Hat
http://people.redhat.com/~rjones
Read my programming and virtualization blog:
http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW