Hi Jerome,

I understand your assertion about ABI stability and would like input from more than 2 people from the community to come up with a consensus as to whether changes to the ABI of this magnitude should require advanced notice.  Please hold a discussion at tomorrow's VPP Community meeting and report back on this thread with the specifics of who attended the meeting and opinions expressed on this topic.  Also, please ask folks at the meeting to respond to this email thread with their opinion.

IMHO, the best way to move this RFP to acceptance is as follows:

1. Add the standalone out-of-tree ABI checker and document it.
2. Provide a means in cmake to select hidden visibility for libvnet, but leave the current visibility as the default
3. Merge RFP gerrit changes
4. Continue discussion on how to handle large ABI breaking changes here and at VPP Community meetings, then document it 5. Post VPP 26.10 RC1 / branch pull (9/23/2026), push/merge a new gerrit change which flips the default to hidden visibility for libvnet 6. Add a release note to VPP 26.10, documenting in which release hidden visibility for libvnet will become default and provide links to the out-of-tree ABI checker documentation, the RFP gerrit changes, and how to opt-out of the ABI change using the mechanism in step 2

Thanks,
-daw-


On 9/2/26 3:41 AM, Jerome Tollet via lists.fd.io wrote:
Hi Dave, all,

Thank you for listing the concerns clearly. I understand the concern about 
downstream compatibility, and I agree that the blast radius should be 
measurable and that out-of-tree plugin maintainers need a practical migration 
path. However, I believe these concerns can be addressed concretely without 
delaying the discussion until October.

On ABI compatibility, there is no documented policy guaranteeing a stable 
libvnet ABI. Across the five release transitions from VPP 24.10 to 26.06, among 
functions both exported by libvnet and declared in installed headers, 262 
functions were added, 92 were removed, and 64 material prototype changes 
affected 62 distinct functions. These included 22 argument-count changes, 35 
argument-type changes, and 7 return-type changes. I have attached the detailed 
results and methodology.

This does not make downstream compatibility irrelevant. It does mean, however, 
that requiring ABI stability specifically for this change would be inconsistent 
unless the same requirement were documented and applied to every libvnet change 
that removes an exported symbol or modifies an exported prototype.

More importantly, this change improves our control over the libvnet interface. 
Today, any non-static symbol may become part of the dynamic interface 
accidentally. Hidden visibility with explicit exports turns that accidental 
interface into an intentional, reviewable, and CI-checked export set. It 
therefore provides a much stronger foundation for defining and maintaining a 
stable ABI in the future, should the project decide to make that commitment.

This is also not merely a visibility cleanup. The optimization that motivated 
this work produced measurable performance improvements, particularly on ARM. 
Measurements showed clear gains across several workloads, with the largest 
improvements in latency-sensitive profiles. The purpose of the proposed series 
is to obtain those benefits through explicit visibility control while 
preserving the symbols that consumers actually require.

Regarding the blast radius, the current patch already checks all in-tree 
consumers, and the runtime validation successfully loaded all 104 configured 
plugins. The checks have also passed with GCC and Clang on x86, and with Clang 
on ARM64.

Florin's concern about global data is already addressed by the current patch: 
the export inventory and CI check cover OBJECT and TLS symbols as well as 
functions, and the data symbols required by in-tree consumers are explicitly 
exported.

The remaining limitation is completeness for out-of-tree consumers, since their 
requirements cannot be inferred from the VPP source tree alone. To address 
that, I propose exposing the existing ELF-based checker as a standalone command 
accepting one or more external plugin binaries. It would report any required 
libvnet function, object, or TLS symbol missing from the explicit export set, 
without requiring the plugin sources or integration into the VPP build.

Regarding the default, making hidden visibility permanently opt-in would 
provide little practical benefit, and the non-default configuration would 
probably receive insufficient CI coverage. To simplify review, I can clearly 
separate the visibility mechanism, the export checks, the out-of-tree checker, 
and the activation of hidden visibility. If a transitional opt-in period is 
considered necessary, it should have an explicit exit criterion rather than 
leaving the feature permanently untested and disabled by default.

This topic has been public since July 23. Benoit has consistently supported the 
hidden-visibility direction and has now suggested discussing it during next 
Tuesday's call. Florin raised the global-data and out-of-tree concerns 
discussed above.

I have also discussed this offline with Damjan. My understanding from those 
exchanges was that he viewed the direction positively, but I do not want to 
speak on his behalf and will leave him to state his position if he wishes.

The concrete RFC series was posted on August 26:

https://gerrit.fd.io/r/c/vpp/+/46571
https://gerrit.fd.io/r/c/vpp/+/46572
https://gerrit.fd.io/r/c/vpp/+/46573

I am happy to discuss this next Tuesday, as Benoit suggested. Before the call, 
I propose to:

1. Add the standalone out-of-tree plugin checker and document its use.
2. Make the ABI-change analysis and methodology available to the community.
3. Ask reviewers to identify any remaining concrete technical issues on Gerrit 
or the mailing list.

The goal of Tuesday's discussion should then be to resolve those remaining 
points and reach a decision on the series, rather than defer the subject to 
October.

Dave, since you mentioned that you would not be available for the two scheduled 
September community meetings, could you please confirm whether you can attend 
next Tuesday's discussion? If not, we can address your concerns in writing 
beforehand and send you a concise summary of the outcome.

I believe the proposed changes address the practical compatibility concerns, 
improve control over what libvnet intentionally exposes, and provide measurable 
performance benefits, particularly on ARM. They also avoid introducing an 
undocumented ABI requirement applied only to this patch.

Best regards,
Jerome



-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#27170): https://lists.fd.io/g/vpp-dev/message/27170
Mute This Topic: https://lists.fd.io/mt/121139638/21656
Group Owner: [email protected]
Unsubscribe: https://lists.fd.io/g/vpp-dev/leave/14379924/21656/631435203/xyzzy 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to