diff --git a/src/petsc4Foam/solvers/petscSolver.C b/src/petsc4Foam/solvers/petscSolver.C
index a55c35d8287db834ea7b04fcc61050f22d8ff6bb..6718ff6deb026573c3e276bd26809c2563e347a9 100644
--- a/src/petsc4Foam/solvers/petscSolver.C
+++ b/src/petsc4Foam/solvers/petscSolver.C
@@ -230,6 +230,9 @@ Foam::solverPerformance Foam::petscSolver::scalarSolve
         fieldName_
     );
 
+    // Retain copy of solverPerformance
+    ctx.performance = solverPerf;
+
     // Create solution and rhs vectors for PETSc
     // We could create these once, and call PlaceArray/ResetArray instead
     PetscWrappedVector petsc_psi(psi, Amat);
@@ -247,7 +250,7 @@ Foam::solverPerformance Foam::petscSolver::scalarSolve
     if (usePetscResidualNorm)
     {
         // Add monitor to record initial residual
-        solverPerf.initialResidual() = 0;
+        ctx.performance.initialResidual() = 0;
         KSPMonitorSet
         (
             ksp,
@@ -293,22 +296,19 @@ Foam::solverPerformance Foam::petscSolver::scalarSolve
     // Set nIterations and final residual
     PetscInt nIters;
     KSPGetIterationNumber(ksp, &nIters);
-    solverPerf.nIterations() = nIters;
+    ctx.performance.nIterations() = nIters;
 
     if (usePetscResidualNorm)
     {
         PetscReal rnorm;
         KSPGetResidualNorm(ksp, &rnorm);
-        solverPerf.finalResidual() = rnorm;
+        ctx.performance.finalResidual() = rnorm;
     }
 
-    // Retain copy of solverPerformance
-    ctx.performance = solverPerf;
-
     ctx.caching.eventEnd();
 
     // Return solver performance to OpenFOAM
-    return solverPerf;
+    return ctx.performance;
 }