Ryan Manning scored an early own goal under pressure from Sam Bell, and Cyle Larin bagged his fourth in four starts to equalise by half an hour.

But Bell beat Shea Charles to a corner to restore the lead midway through the second half, before substitute Ross Stewart headed home a leveller.

Saints rued a big Charles chance not taken as they made it 20 games without defeat, but saw hopes of finishing in the Championship’s top two dented.

Millwall’s 3-1 victory at Stoke took them three points clear of Saints in second with just two games to go, while Saints must also leapfrog Ipswich Town.

It was honours even in the dugouts between managers with the largest age gap in a Championship fixture, as Roy Hodgson returned to St Mary’s.

Southampton’s unbeaten run reaches 20 games but that’s probably that for the automatic chances.

Que sera, sera rings out at St Mary’s. An FA Cup semi-final vs Man City at Wembley up next…#SaintsFC pic.twitter.com/sdc4TgcuGi

— George Rees-Julian (@rees_julian) April 21, 2026

Tonda Eckert wanted to make four changes to his starting lineup that beat Swansea City, with Jack Stephens, Charles, Cameron Archer and Larin all in.

But Stephens felt something in the warm-up and pulled out of the game last-minute, seeing Nathan Wood retain his place from the trip to Wales.

Eckert was not deterred by Bristol City’s record against Saints when he spoke pre-match, referencing other “curses” that his side have corrected.

But the Robins had won six of the last seven league meetings and ended the club’s record 25-match unbeaten run with a 3-1 win in February 2024.

They also thrashed Will Still’s faltering charges 3-1 in October last year, and looked to be repeating the trick with an opening goal after five minutes.

Daniel Peretz had already made a big save to deny Delano Burgzorg when an in-swinging cross from Scott Twine was turned in by Ryan Manning.

Saints looked sluggish after the goal, and were perhaps a little lucky that Charles was not sent off as he slipped into a two-footed tackle in midfield.

But Larin pulled the hosts level after 29 minutes, as Manning’s crossed free-kick fell to his feet inside the six-yard box for his seventh goal for the club.

The tactical battle developed with James Bree specifically tasked with man-marking talisman Twine, but the two sides went into the break level.

Archer had a sight at goal from range immediately after the restart, but Eckert had refreshed both wings by the hour with a winning goal no closer.

Leo Scienza might have had a tap-in with his first touch, but Larin’s square ball across the box was a touch behind the Brazilian at the back-post.

However, Bell got on the scoresheet when he beat Charles in a duel to head a corner-kick over his shoulder into the far corner in the 63rd minute.

Eckert turned to the bench and introduced Stewart for James Bree, in a move which paid dividends after the Scot’s almost immediate equaliser.

Some brilliant hold-up play by Larin and a delicious hanging cross from Tom Fellows set up the physically imposing Stewart for a brutish headed goal.

Then Charles should have put Saints ahead from inside the six-yard box, but his volley from Caspar Jander’s header in was straight at the goalkeeper.

Saints pushed in seven added minutes, but Bristol City – aided by strange officiating – survived a goalmouth scramble and Peretz going up for a late corner.

Saints: Peretz; Bree (Stewart, 70), Harwood-Bellis, Wood, Manning; Downes (Bragg, 86), Charles, Matsuki (Fellows, 57), Azaz (Jander, 70), Archer (Scienza, 57); Larin.

Unused subs: Long, Wood, Edozie, Welington.

Booked: Charles, Downes, Larin.

Bristol City: Vítek; Pring, Borges, Eile, McCrorie, Horvat (Dickie, 80), Morsy, Bell (Sykes, 72), Twine, Knight, Burgzorg.

Unused subs: Thomas, Riis, Tanner, Naylor, Armstrong, Earthy, Young.

Booked: Knight, Dickie, Morsy, Pring.

Referee: Elliot Bell.