public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH pve-network 3/3] fix #7738: zones: use pre-computed bridge port list
Date: Thu,  9 Jul 2026 15:28:55 +0200	[thread overview]
Message-ID: <20260709132857.239615-4-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20260709132857.239615-1-s.hanreich@proxmox.com>

The VLAN and QinQ zone utilized ip_link_details to obtain information
about the physical ports contained on a bridge. Instead of executing
iproute2 and computing the bridge ports for every VNet, precalculate
the bridge port list using the new helper in pve-common and then
re-use the ouput obtained at the start of the run.

Remove the get_bridge_ifaces function, since there are no longer any
call sites for this function.

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
 src/PVE/Network/SDN/Zones.pm            |  3 +++
 src/PVE/Network/SDN/Zones/Plugin.pm     |  7 +------
 src/PVE/Network/SDN/Zones/QinQPlugin.pm |  5 +++--
 src/PVE/Network/SDN/Zones/VlanPlugin.pm |  5 +++--
 src/test/run_test_zones.pl              | 13 ++++++++++---
 5 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/src/PVE/Network/SDN/Zones.pm b/src/PVE/Network/SDN/Zones.pm
index 4c1468cf..f1fb32d9 100644
--- a/src/PVE/Network/SDN/Zones.pm
+++ b/src/PVE/Network/SDN/Zones.pm
@@ -7,6 +7,7 @@ use JSON;
 
 use PVE::Tools qw(extract_param dir_glob_regex run_command);
 use PVE::Cluster qw(cfs_read_file cfs_write_file cfs_lock_file);
+use PVE::IPRoute2;
 use PVE::Network;
 
 use PVE::Network::SDN::Vnets;
@@ -117,6 +118,7 @@ sub generate_etc_network_config {
     return if !$vnet_cfg && !$zone_cfg;
 
     my $interfaces_config = PVE::INotify::read_file('interfaces');
+    my $bridge_ports = PVE::IPRoute2::get_bridge_port_mapping();
 
     #generate configuration
     my $config = {};
@@ -157,6 +159,7 @@ sub generate_etc_network_config {
                 $subnet_cfg,
                 $interfaces_config,
                 $config,
+                $bridge_ports,
             );
         };
         if (my $err = $@) {
diff --git a/src/PVE/Network/SDN/Zones/Plugin.pm b/src/PVE/Network/SDN/Zones/Plugin.pm
index 74a3384c..184fca4e 100644
--- a/src/PVE/Network/SDN/Zones/Plugin.pm
+++ b/src/PVE/Network/SDN/Zones/Plugin.pm
@@ -5,7 +5,6 @@ use warnings;
 
 use PVE::Tools qw(run_command);
 use Net::IP qw(ip_get_version);
-use PVE::IPRoute2;
 use PVE::JSONSchema;
 use PVE::Cluster;
 use PVE::Network;
@@ -112,6 +111,7 @@ sub generate_sdn_config {
         $subnet_cfg,
         $interfaces_config,
         $config,
+        $bridge_ports,
     ) = @_;
 
     die "please implement inside plugin";
@@ -385,11 +385,6 @@ sub is_vlanaware {
     return PVE::Tools::file_read_firstline("/sys/class/net/$bridge/bridge/vlan_filtering");
 }
 
-sub get_bridge_ifaces {
-    my ($bridge) = @_;
-    return PVE::IPRoute2::get_physical_bridge_ports($bridge);
-}
-
 sub datacenter_config {
     return PVE::Cluster::cfs_read_file('datacenter.cfg');
 }
diff --git a/src/PVE/Network/SDN/Zones/QinQPlugin.pm b/src/PVE/Network/SDN/Zones/QinQPlugin.pm
index a75940c6..642420e9 100644
--- a/src/PVE/Network/SDN/Zones/QinQPlugin.pm
+++ b/src/PVE/Network/SDN/Zones/QinQPlugin.pm
@@ -64,6 +64,7 @@ sub generate_sdn_config {
         $subnet_cfg,
         $interfaces_config,
         $config,
+        $bridge_ports,
     ) = @_;
 
     my ($bridge, $mtu, $stag) = $plugin_config->@{ 'bridge', 'mtu', 'tag' };
@@ -128,9 +129,9 @@ sub generate_sdn_config {
     } else {
         # eth--->eth.x(svlan)----->vlanwarebridge-(tag)----->vnet---->vnet
 
-        my @bridge_ifaces = PVE::Network::SDN::Zones::Plugin::get_bridge_ifaces($bridge);
+        my $bridge_ifaces = $bridge_ports->{$bridge};
 
-        for my $bridge_iface (@bridge_ifaces) {
+        for my $bridge_iface ($bridge_ifaces->@*) {
             # use named vlan interface to avoid too long names
             my $svlan_iface = "sv_$zoneid";
 
diff --git a/src/PVE/Network/SDN/Zones/VlanPlugin.pm b/src/PVE/Network/SDN/Zones/VlanPlugin.pm
index 9102b34f..271b3fab 100644
--- a/src/PVE/Network/SDN/Zones/VlanPlugin.pm
+++ b/src/PVE/Network/SDN/Zones/VlanPlugin.pm
@@ -63,6 +63,7 @@ sub generate_sdn_config {
         $subnet_cfg,
         $interfaces_config,
         $config,
+        $bridge_ports,
     ) = @_;
 
     my $bridge = $plugin_config->{bridge};
@@ -112,10 +113,10 @@ sub generate_sdn_config {
 
         my $bridgevlan = $bridge . "v" . $tag;
 
-        my @bridge_ifaces = PVE::Network::SDN::Zones::Plugin::get_bridge_ifaces($bridge);
+        my $bridge_ifaces = $bridge_ports->{$bridge};
 
         my $bridge_ports = "";
-        foreach my $bridge_iface (@bridge_ifaces) {
+        foreach my $bridge_iface ($bridge_ifaces->@*) {
             $bridge_ports .= " $bridge_iface.$tag";
         }
 
diff --git a/src/test/run_test_zones.pl b/src/test/run_test_zones.pl
index dd458b77..f8ef7375 100755
--- a/src/test/run_test_zones.pl
+++ b/src/test/run_test_zones.pl
@@ -55,6 +55,16 @@ foreach my $test (@tests) {
         },
     );
 
+    my $pve_common_iproute;
+    $pve_common_iproute = Test::MockModule->new('PVE::IPRoute2');
+    $pve_common_iproute->mock(
+        get_bridge_port_mapping => sub {
+            return {
+                vmbr0 => ["eth0"],
+            },;
+        },
+    );
+
     my $pve_common_network;
     $pve_common_network = Test::MockModule->new('PVE::Network');
     $pve_common_network->mock(
@@ -94,9 +104,6 @@ foreach my $test (@tests) {
         is_vlanaware => sub {
             return $interfaces_config->{ifaces}->{vmbr0}->{'bridge_vlan_aware'};
         },
-        get_bridge_ifaces => sub {
-            return ('eth0');
-        },
         find_bridge => sub {
             return;
         },
-- 
2.47.3





      parent reply	other threads:[~2026-07-09 13:29 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-09 13:28 [PATCH common/network 0/3] Performance improvements for applying VLAN / QinQ zones Stefan Hanreich
2026-07-09 13:28 ` [PATCH pve-common 1/3] iproute2: restructure get_physical_bridge_ports Stefan Hanreich
2026-07-09 13:28 ` [PATCH pve-common 2/3] iproute2: add helper for getting bridge port mappings Stefan Hanreich
2026-07-09 13:28 ` Stefan Hanreich [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260709132857.239615-4-s.hanreich@proxmox.com \
    --to=s.hanreich@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal