<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>It's Pi all the way down... - snaps</title><link href="https://waldorf.waveform.org.uk/" rel="alternate"></link><link href="https://waldorf.waveform.org.uk/feeds/snaps.atom.xml" rel="self"></link><id>https://waldorf.waveform.org.uk/</id><updated>2025-07-11T11:58:36+01:00</updated><entry><title>D0!</title><link href="https://waldorf.waveform.org.uk/2025/d0.html" rel="alternate"></link><published>2025-07-04T00:00:00+01:00</published><updated>2025-07-11T11:58:36+01:00</updated><author><name>Dave Jones</name></author><id>tag:waldorf.waveform.org.uk,2025-07-04:/2025/d0.html</id><summary type="html">&lt;p class="first last"&gt;A look at how new hardware and lengthy dependency chains combine to
make&amp;nbsp;trouble!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;&lt;strong&gt;Updated&lt;/strong&gt;: To include the picture I forgot, and fix a bunch of&amp;nbsp;typos&lt;/p&gt;
&lt;p&gt;Dear&amp;nbsp;Reader,&lt;/p&gt;
&lt;p&gt;Please be forewarned that this is a rambling mess of a post that will dart off
on tangents a-plenty. This was originally planned to be posted before noble&amp;#8217;s
.2 release, but too many work things go in the way and it&amp;#8217;s laid in the drafts
folder until I noticed it again while writing something&amp;nbsp;else!&lt;/p&gt;
&lt;p&gt;Anyway, this may at least be an entertaining distraction into the effort that
goes in to dealing with hardware changes in&amp;nbsp;Ubuntu.&lt;/p&gt;
&lt;p&gt;Buckle&amp;nbsp;up!&lt;/p&gt;
&lt;div class="section" id="background"&gt;
&lt;h2&gt;Background&lt;/h2&gt;
&lt;p&gt;First of all… what&amp;#8217;s a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Stepping_level"&gt;stepping&lt;/a&gt;? Put simply, it&amp;#8217;s a specific version of a
particular chip. A new stepping might be released to fix a bug, or improve
yields, or make other improvements to a design, but it isn&amp;#8217;t a fundamentally
new design. Think of it like a bump in a minor version&amp;nbsp;number.&lt;/p&gt;
&lt;p&gt;There have been new steppings of Raspberry Pi &lt;a class="reference external" href="https://en.wikipedia.org/wiki/System_on_a_chip"&gt;SoCs&lt;/a&gt; in the past, but
you may not have noticed. For example, the Pi 4 uses the Broadcom 2711 as its
SoC. At launch, this was the B0 stepping. However, when the Compute Module 4
launched later, it moved to the C0 stepping, which corrected an issue in the
boot loader&amp;#8217;s verification mechanism. I &lt;em&gt;think&lt;/em&gt; later versions of the Pi 4
moved to this stepping as well, but looking at my range of Pi 4 boards here,
they&amp;#8217;re all&amp;nbsp;B0s.&lt;/p&gt;
&lt;p&gt;What about the Pi 5? The &lt;span class="caps"&gt;4GB&lt;/span&gt; and &lt;span class="caps"&gt;8GB&lt;/span&gt; models initially launched, shipped with
the C1 stepping of the Broadcom 2712 SoC. However, Broadcom&amp;#8217;s initial design of
the 2712 included several features which were never used in the Pi 5,
increasing the cost and the power draw of the chip without any benefit. So much
so, that initially the planned &lt;span class="caps"&gt;2GB&lt;/span&gt; variant of the Pi 5 was uneconomic to&amp;nbsp;produce.&lt;/p&gt;
&lt;p&gt;The new 2712 D0 stepping stripped out this &amp;#8220;&lt;a class="reference external" href="https://www.raspberrypi.com/news/2gb-raspberry-pi-5-on-sale-now-at-50/"&gt;dark silicon&lt;/a&gt;&amp;#8220;, reportedly as
much as 30% of the die, making the &lt;span class="caps"&gt;2GB&lt;/span&gt; possible to produce. It was also used in
the subsequent launches of the Compute Module 5, and later the &lt;span class="caps"&gt;16GB&lt;/span&gt; Pi 5
variant launched in January this year. The assumption is that at some point the
D0 will become the standard silicon on the &lt;span class="caps"&gt;4GB&lt;/span&gt; and &lt;span class="caps"&gt;8GB&lt;/span&gt; models&amp;nbsp;too.&lt;/p&gt;
&lt;p&gt;So far, so good. But also, so what? Why does the &lt;span class="caps"&gt;OS&lt;/span&gt; care about the&amp;nbsp;stepping?&lt;/p&gt;
&lt;p&gt;The D0 stepping introduced another change: one of the data structures
associated with the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Shader"&gt;shaders&lt;/a&gt; grew some new fields in the &lt;em&gt;middle&lt;/em&gt;
of the structure, shuffling the locations of other fields. Stripping out some
details of the structures to make the diff a bit easier to&amp;nbsp;read:&lt;/p&gt;
&lt;pre class="code diff literal-block"&gt;
&lt;span class="gd"&gt;-&amp;lt;struct name=&amp;quot;GL Shader State Record&amp;quot; min_ver=&amp;quot;71&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+&amp;lt;struct name=&amp;quot;GL Shader State Record Draw Index&amp;quot; min_ver=&amp;quot;71&amp;quot;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Point size in shaded vertex data&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Enable clipping&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;

 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Vertex ID read by coordinate shader&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Instance ID read by coordinate shader&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Base Instance ID read by coordinate shader&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+    &amp;lt;field name=&amp;quot;cs_basevertex&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+    &amp;lt;field name=&amp;quot;cs_drawindex&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Vertex ID read by vertex shader&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Instance ID read by vertex shader&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Base Instance ID read by vertex shader&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+    &amp;lt;field name=&amp;quot;vs_basevertex&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gi"&gt;+    &amp;lt;field name=&amp;quot;vs_drawindex&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;

 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Fragment shader does Z writes&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;&lt;span class="w"&gt;
 &lt;/span&gt;    &amp;lt;field name=&amp;quot;Turn off early-z test&amp;quot; size=&amp;quot;1&amp;quot; type=&amp;quot;bool&amp;quot;/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This is a breaking change, requiring &lt;a class="reference external" href="https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29189/diffs"&gt;changes&lt;/a&gt; in &lt;a class="reference external" href="https://gitlab.freedesktop.org/mesa/mesa"&gt;mesa&lt;/a&gt; (the
library that provides various graphical APIs including &lt;a class="reference external" href="https://en.wikipedia.org/wiki/OpenGL"&gt;OpenGL&lt;/a&gt; and
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Vulkan"&gt;Vulkan&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So, how can you tell if you&amp;#8217;ve got a C1 or a D0 stepping of a 2712? You could
take the cooler off your Pi 5 and look at the lid of the SoC. The stepping is
just near the end of the long&amp;nbsp;code.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="Overhead view of a 2 Pi 5s. Zooms of their SoCs show that the top Pi 5 has the &amp;quot;C1&amp;quot; stepping, while the bottom one has the &amp;quot;D0&amp;quot; stepping." src="https://waldorf.waveform.org.uk/images/pi5-c1-d0.jpg" /&gt;
&lt;p class="caption"&gt;It&amp;#8217;s spot the difference time! The easy stepping difference has been
pointed out for you. Can you find the other two differences? No cheating by
looking at the &lt;a class="reference external" href="https://pip.raspberrypi.com/categories/1129-pcn/documents/RP-006041-PC/PCN-Raspberry-Pi-5B-Rev-4.pdf"&gt;&lt;span class="caps"&gt;PCN&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Alternatively, you could try and use Ubuntu 24.04.1 (noble&amp;#8217;s .1) Desktop image.
If you&amp;#8217;ve got a C1, it works! If you&amp;#8217;ve got a D0 … erm&amp;nbsp;…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="raspios"&gt;
&lt;h2&gt;RaspiOS&lt;/h2&gt;
&lt;p&gt;How do we fix this? First let&amp;#8217;s look at RaspiOS. Obviously mesa needs updating,
with the requisite &lt;a class="reference external" href="https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29189/diffs"&gt;changes&lt;/a&gt;. RaspiOS added these in version
23.2.1-1~bpo12+rpt3 with the following slightly unceremonious&amp;nbsp;changelog:&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
mesa (23.2.1-1~bpo12+rpt3) bookworm; urgency=medium

  * Update patches
&lt;/pre&gt;
&lt;p&gt;To be fair, this may have been a matter of trying to keep the existence of the
new stepping relatively quiet (though anyone constructing a debdiff would see
the 2712D0 mentioned quite prominently). The release date on that package is
January 2024, and the Pi 5 &lt;span class="caps"&gt;2GB&lt;/span&gt; model featuring the D0 didn&amp;#8217;t hit the market
until August&amp;nbsp;2024.&lt;/p&gt;
&lt;p&gt;Still, this is basically all that happens in RaspiOS &lt;a class="footnote-reference" href="#new-dts" id="footnote-reference-1"&gt;[1]&lt;/a&gt;. New mesa, job&amp;nbsp;done.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="ubuntu"&gt;
&lt;h2&gt;Ubuntu&lt;/h2&gt;
&lt;p&gt;Over in Ubuntu land, things are a bit more complex. As it turned out, the fix
was already in the development version (sync&amp;#8217;d from upstream), and even
Oracular (24.10 which is about to go &lt;abbr title="End of Life"&gt;&lt;span class="caps"&gt;EOL&lt;/span&gt;&lt;/abbr&gt; as I write this)
had a sufficiently up to date mesa to incorporate the&amp;nbsp;fix.&lt;/p&gt;
&lt;p&gt;However, the interim versions are not what most Ubuntu users are interested in.
The &lt;em&gt;vast&lt;/em&gt; majority of Ubuntu users (something like 99%) stick with the
&lt;abbr title="Long Term Service"&gt;&lt;span class="caps"&gt;LTS&lt;/span&gt;&lt;/abbr&gt; releases which at the time of writing is noble
(24.04). In order to fix things in an existing stable release, we needed an
&lt;abbr title="Stable Release Update"&gt;&lt;span class="caps"&gt;SRU&lt;/span&gt;&lt;/abbr&gt;…&lt;/p&gt;
&lt;div class="section" id="sru"&gt;
&lt;h3&gt;&lt;span class="caps"&gt;SRU&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;A quick tangent on Stable Release Updates, or SRUs as we refer to them (because
there&amp;#8217;s nothing more developers love than another &lt;abbr title="Three Letter Acronym"&gt;&lt;span class="caps"&gt;TLA&lt;/span&gt;&lt;/abbr&gt;). Actually, first another tangent on stability of Linux&amp;nbsp;distros.&lt;/p&gt;
&lt;p&gt;Linux distributions can be roughly divided into two categories: stable distros
and rolling distros. Stable distros grew out of the frustrations of server
operators who wanted a guarantee of stability above all else: once the system
was installed and working the &lt;em&gt;only&lt;/em&gt; updates they wished to see were those that
fixed bugs. They had precisely zero interest in new features and even minor bug
fixes were probably more risk than they were worth. The only time risk was
introduced into the equation was when the &lt;span class="caps"&gt;OS&lt;/span&gt; as a whole was updated (a
&amp;#8220;dist-upgrade&amp;#8221; in Debian terms), and because this was a known risk, it would be
planned for, tested, and implemented in a controlled&amp;nbsp;manner.&lt;/p&gt;
&lt;p&gt;Classic &amp;#8220;stable&amp;#8221; distros include Red Hat, Debian, and of course&amp;nbsp;Ubuntu.&lt;/p&gt;
&lt;p&gt;The rolling distros by contrast, have no concept of an &lt;span class="caps"&gt;OS&lt;/span&gt; &amp;#8220;release&amp;#8221;. They
simply package the latest versions of all things at all times. Much of the
time, this does work reasonably well, but it does mean that at certain times
there fairly major changes that happen in a more or less &amp;#8220;adhoc&amp;#8221; fashion.
Historically, consider the move to systemd, or transitions between Qt&amp;nbsp;versions.&lt;/p&gt;
&lt;p&gt;Classic &amp;#8220;rolling&amp;#8221; distros include Gentoo and&amp;nbsp;Arch.&lt;/p&gt;
&lt;p&gt;Some distros incorporate both models. Alpine and Debian are examples of these.
While Debian has a &amp;#8220;stable&amp;#8221; release (currently &amp;#8220;bookworm&amp;#8221;, soon to be
&amp;#8220;trixie&amp;#8221;), it also has the &amp;#8220;unstable&amp;#8221; branch called &amp;#8220;sid&amp;#8221; which is basically a
rolling distro in itself. Alpine likewise makes six monthly releases, but has a
rolling &amp;#8220;edge&amp;#8221;&amp;nbsp;branch.&lt;/p&gt;
&lt;p&gt;While the &amp;#8220;stable&amp;#8221; distro model is widely accepted (and very reasonable, in
this writer&amp;#8217;s opinion), it does cause some tension, particularly with the rise
of desktop Linux usage. Desktop users often &lt;em&gt;do&lt;/em&gt; want the fancy new features in
their applications, don&amp;#8217;t have the same level of risk-aversion as the typical
hard-boiled sysadmin &lt;a class="footnote-reference" href="#paranoid" id="footnote-reference-2"&gt;[2]&lt;/a&gt;, and thus aren&amp;#8217;t willing to wait 2 or 3 years
for the next release of their stable distro to get them. This is part of the
drive behind the rise of &amp;#8220;alternate&amp;#8221; packaging systems on various distros
(Flatpaks, Snaps, AppImages,&amp;nbsp;etc).&lt;/p&gt;
&lt;p&gt;On Ubuntu, updates to stable releases (outside of the realm of snaps) have to
follow the &lt;a class="reference external" href="https://documentation.ubuntu.com/sru/en/latest/"&gt;Stable Release Update&lt;/a&gt; process which incorporates numerous checks
and balances to try and avoid regressions. Test plans must be written,
reviewed, and agreed upon before anything is even uploaded. Updates must be
minimally invasive (no full version backports &amp;#8212; those have to follow a
separate process which doesn&amp;#8217;t automatically update existing installs). After
upload, verification is carried out, and only &lt;em&gt;then&lt;/em&gt; is the fix allowed into
the&amp;nbsp;release.&lt;/p&gt;
&lt;p&gt;But not right&amp;nbsp;away…&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="phasing"&gt;
&lt;h3&gt;Phasing&lt;/h3&gt;
&lt;p&gt;Even after an update to a stable release has made it through review,
verification, and upload, such updates go through a &amp;#8220;phasing&amp;#8221; procedure. This
is where the update is slowly trickled out to larger and larger proportions of
the userbase. The idea is that, if an update does have a catastrophic bug in
it, the damage can be limited to the portion of the userbase that (randomly or
by choice) got the update early. In the event of a nasty bug appearing in a
stable update, phasing can be halted and the issue investigated before either
rolling back the update, or deciding it&amp;#8217;s a false-positive and resuming the&amp;nbsp;phasing.&lt;/p&gt;
&lt;p&gt;Incidentally, the &lt;a class="reference external" href="https://ubuntu-archive-team.ubuntu.com/pending-sru"&gt;stable release updates report&lt;/a&gt;, and the &lt;a class="reference external" href="https://ubuntu-archive-team.ubuntu.com/phased-updates.html"&gt;phasing report&lt;/a&gt;
are both public if you want to peak at what&amp;#8217;s in the pipeline of your stable
install! You can read more &lt;a class="reference external" href="https://documentation.ubuntu.com/server/explanation/software/about-apt-upgrade-and-phased-updates/"&gt;about phasing&lt;/a&gt; in the server&amp;nbsp;documentation.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="noble"&gt;
&lt;h3&gt;Noble&lt;/h3&gt;
&lt;p&gt;Okay, back to the story. Mesa was up to date in oracular, but we needed an &lt;span class="caps"&gt;SRU&lt;/span&gt;
to noble to avoid new Pi 5 owners getting a full blown crash the second
anything graphical like a login screen dared show its face on the&amp;nbsp;monitor.&lt;/p&gt;
&lt;p&gt;Time for a noble &lt;span class="caps"&gt;SRU&lt;/span&gt;. The &lt;span class="caps"&gt;SRU&lt;/span&gt; was written (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/2082072"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #2082072&lt;/a&gt;), the update
sponsored, verification performed, phasing completed, and by the middle of
October everything was&amp;nbsp;fixed.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
mesa (24.0.9-0ubuntu0.2) noble; urgency=medium

  * Add support for Pi 2712D0 stepping (LP: #2082072)
&lt;/pre&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;I said, everything was &lt;em&gt;fixed&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;Right?&lt;/p&gt;
&lt;p&gt;…&lt;/p&gt;
&lt;p&gt;Oh,&amp;nbsp;****!&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="snaps"&gt;
&lt;h3&gt;Snaps&lt;/h3&gt;
&lt;p&gt;One thing I&amp;#8217;d forgotten about in this whole process was that there&amp;#8217;s no longer
just &lt;em&gt;one&lt;/em&gt; version of mesa on most Ubuntu desktop systems. Nowadays, a fair
number of applications, including some vaguely important ones like Firefox, are
shipped as snaps, at least partly in order to alleviate the aforementioned
tension between stable distros and desktop users demanding the latest and
greatest&amp;nbsp;versions.&lt;/p&gt;
&lt;p&gt;There are many ways to handle distributing the &amp;#8220;latest&amp;#8221; versions of things on a
stable distro, but one of the things that must be dealt with is the conflict
between the versions of libraries on the stable distro, and the libraries that
the &amp;#8220;latest&amp;#8221; thing&amp;nbsp;expects.&lt;/p&gt;
&lt;p&gt;One method is to simply &amp;#8220;bundle everything&amp;#8221;; include all the libraries that
your app expects within its package. Obviously this results in a rather bloated
package which isn&amp;#8217;t going to share any libraries with anything else on the
system, and thus takes more time to load and more memory to run. It also means
dealing with all the path nonsense to ensure your application only loads the
versions of libraries from its own location. This doesn&amp;#8217;t solve &lt;em&gt;all&lt;/em&gt; the
bundling issues, but it does solve most and it is at least&amp;nbsp;simple.&lt;/p&gt;
&lt;p&gt;Another method is &amp;#8220;statically compile everything&amp;#8221;. This is a close cousin to
bundling everything, and still results in a fairly huge download but a little
slimmer than bundling all the libraries (and still shares basically nothing at
runtime). This is becoming more common with the rise of things like go and
rust, which compile this way by default &lt;a class="footnote-reference" href="#no-better" id="footnote-reference-3"&gt;[3]&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Snaps take a rather interesting (and different) approach&amp;nbsp;here.&lt;/p&gt;
&lt;p&gt;All snaps are built with a &amp;#8220;base&amp;#8221; snap which represents a stable release of
Ubuntu (core22 represents a jammy base, core24 a noble base, and so on). The
&amp;#8220;base&amp;#8221; snap provides the &amp;#8220;common&amp;#8221; libraries that the snap would expect to find
on such a stable release of&amp;nbsp;Ubuntu.&lt;/p&gt;
&lt;p&gt;The snap can still statically compile, or bundle, whatever it likes, but this
means at least &lt;em&gt;some&lt;/em&gt; of its dependencies can be shared (from the base snap).
Moreover, the method by which snaps are mounted means that multiple versions of
these core snaps can co-exist so it&amp;#8217;s fine to be running a snap based on
core22, and another based on core24 (obviously they won&amp;#8217;t be sharing their core
libraries in this case, but that&amp;#8217;s the&amp;nbsp;trade-off).&lt;/p&gt;
&lt;p&gt;The libraries the core snaps include are fairly limited and, notably, &lt;em&gt;don&amp;#8217;t&lt;/em&gt;
include mesa. However, there are also &amp;#8220;content&amp;#8221; snaps that provide commonly
used sets of libraries above and beyond the core snaps. One of these is the
&amp;#8220;gnome&amp;#8221; content snap which provides (surprise surprise), Gnome, &lt;span class="caps"&gt;GTK&lt;/span&gt;, and, you
guessed it, mesa. The gnome content snap itself comes in several versions to
accomodate different &amp;#8220;base&amp;#8221;&amp;nbsp;snaps:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://snapcraft.io/gnome-42-2204"&gt;gnome-42-2204&lt;/a&gt; is the gnome content snap using core22 (jammy) as a&amp;nbsp;base&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="https://snapcraft.io/gnome-46-2404"&gt;gnome-46-2404&lt;/a&gt; is the gnome content snap using core24 (noble) as a&amp;nbsp;base&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now… guess which gnome content snap Firefox is (still, at the time of writing)&amp;nbsp;using?&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="jammy"&gt;
&lt;h3&gt;Jammy&lt;/h3&gt;
&lt;p&gt;Shortly after the middle of October, and the noble &lt;span class="caps"&gt;SRU&lt;/span&gt; landing, I noticed we
had another problem. The noble daily would happily boot to the login prompt on
the new D0 Pi 5, and I could login and run many things. But not Firefox.
Starting that, or anything else on the core22 snap, froze the entire desktop.
Not&amp;nbsp;good.&lt;/p&gt;
&lt;p&gt;So, back to the &lt;span class="caps"&gt;SRU&lt;/span&gt; queue. The original ticket (&lt;a class="reference external" href="https://bugs.launchpad.net/ubuntu/+source/mesa/+bug/2082072"&gt;&lt;span class="caps"&gt;LP&lt;/span&gt;: #2082072&lt;/a&gt;) was
re-targeted for jammy, the upload was made, and a bunch of other packages
regressed. Damn! Various retries later and the package was ready for&amp;nbsp;verification.&lt;/p&gt;
&lt;p&gt;But… now we had a problem. This was only an update to the mesa &lt;em&gt;deb&lt;/em&gt; package,
in Ubuntu jammy (22.04). This wasn&amp;#8217;t an update to the gnome content snap; that
would have to be done &lt;em&gt;after&lt;/em&gt; verification of the &lt;span class="caps"&gt;SRU&lt;/span&gt;. But the Pi 5 was
fundamentally &lt;em&gt;not supported&lt;/em&gt; in&amp;nbsp;jammy.&lt;/p&gt;
&lt;p&gt;Rather than trying to get a jammy image into a state it could boot (and run
Gnome) on a Pi 5, I opted to rebuild the gnome content snap locally to verify
things instead. This took a few days to work out as it&amp;#8217;s an almost entirely
undocumented process and I had to figure out that the gnome-sdk snap needed
rebuilding first (i.e. the chain goes: mesa deb -&amp;gt; gnome-sdk snap -&amp;gt; gnome&amp;nbsp;snap).&lt;/p&gt;
&lt;p&gt;To cut a long story short (or at least… less long), eventually the verification
was done, and the jammy mesa update was&amp;nbsp;released.&lt;/p&gt;
&lt;pre class="code text literal-block"&gt;
mesa (23.2.1-1ubuntu3.1~22.04.3) jammy; urgency=medium

  [ Timo Aaltonen ]
  * Add support for Pi 2712D0 stepping (LP: #2082072)

  [ Alessandro Astone ]
  * patches: Backport patch for green artifacting and GPU crash on
    radeonsi with kernel &amp;gt;= 6.10 (LP: #2083538)
&lt;/pre&gt;
&lt;p&gt;Phasing was then completed, then the gnome-sdk snap was rebuilt, then gnome
content snap, and &lt;em&gt;finally&lt;/em&gt; Firefox was working on the D0&amp;nbsp;stepping.&lt;/p&gt;
&lt;p&gt;By the time all this was done, it was the 31st of Jan. To give some context,
the .2 release of noble was scheduled for the 13th of Feb, and I was adamant
that we had to get the mesa fix in for that otherwise we&amp;#8217;d have new Pi 5 owners
unable to run Firefox &amp;#8220;out of the box&amp;#8221; on our current &lt;span class="caps"&gt;LTS&lt;/span&gt;. You could argue:
&amp;#8220;users can still login, they can always get the release from updates?&amp;#8221;.
However, the app-store is &lt;em&gt;also&lt;/em&gt; a core22 snap, and hence &lt;em&gt;also crashed the
desktop&lt;/em&gt;. While there was still the &lt;tt class="docutils literal"&gt;sudo snap refresh&lt;/tt&gt; route, I&amp;#8217;m loathe to
tell desktop users they &lt;em&gt;have&lt;/em&gt; to use the command&amp;nbsp;line.&lt;/p&gt;
&lt;p&gt;Suffice to say, it was butt-clenching time in the run up to noble&amp;#8217;s .2&amp;nbsp;release.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="a-heavy-chain-of-dependencies"&gt;
&lt;h2&gt;A heavy chain (of&amp;nbsp;dependencies)&lt;/h2&gt;
&lt;p&gt;What&amp;#8217;s the moral of the&amp;nbsp;story?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not entirely sure. Half the problem is that everything above has &lt;em&gt;good
reason&lt;/em&gt; for being the way it is. The &lt;span class="caps"&gt;SRU&lt;/span&gt; process is long and complicated
because it&amp;#8217;s borne of the pain of unexpected regressions. It is the way it is,
because the alternative is actually more&amp;nbsp;painful.&lt;/p&gt;
&lt;p&gt;The snap eco-system is the way it is to avoid the more painful issues with
bundling absolutely&amp;nbsp;everything.&lt;/p&gt;
&lt;p&gt;Still, what we have here is a dependency chain with &lt;em&gt;many&lt;/em&gt; links, and I can&amp;#8217;t
help but think some of those links &lt;em&gt;may&lt;/em&gt; be unnecessary (or at least warrant
some&amp;nbsp;consideration).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Should a content snap rely on another snap (the gnome-sdk snap in the middle
of the chain,&amp;nbsp;here)?&lt;/li&gt;
&lt;li&gt;Should the gnome content snap rely on the jammy debs at all, or should it be
able to pull in patches independently of&amp;nbsp;them?&lt;/li&gt;
&lt;li&gt;Should we mandate that seeded snaps always have (useful) contact information
and well-documented procedures for&amp;nbsp;building?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That said, there are trade-offs in every direction here. At the moment, the
gnome content snap can reasonably rely on the stability (and quality)
guarantees of the underlying deb. Do we really want to move away from that?
Should we be pushing seeded applications to use later base snaps, so that SRUs
don&amp;#8217;t have to go back as far in&amp;nbsp;time?&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t know the answers to all this yet. But I do know taking 3+ months to get
a fix to the place it needs to be is no&amp;nbsp;fun!&lt;/p&gt;
&lt;hr class="docutils" /&gt;
&lt;table class="docutils footnote" frame="void" id="new-dts" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;This is categorically not true. New device-trees were also added
and probably a whole host of other changes I haven&amp;#8217;t noticed, but this post
is going to be waffley enough without me going off track with every detail!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="paranoid" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;I originally wrote &amp;#8220;paranoia of the sys-admin&amp;#8221;, but frankly it&amp;#8217;s
&lt;em&gt;not&lt;/em&gt; paranoia. This level of risk-aversion is usually the result of
hard-learned lessons!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="no-better" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#footnote-reference-3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Which is not to say I think it&amp;#8217;s any better. Both static
compilation and bundling of everything do &amp;#8220;challenge&amp;#8221; the security / bug-fix
model of classic distributions by essentially ignoring updates to some / all
base libraries. Provided they actually stay &lt;em&gt;ahead&lt;/em&gt; of those base libraries,
that&amp;#8217;s not an issue…&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="misc"></category><category term="ubuntu"></category><category term="pi"></category><category term="noble"></category><category term="oracular"></category><category term="snaps"></category><category term="d0"></category></entry></feed>