@BABOLO modify 2005-04-26 Original http://www.ambrisko.com/doug/ata/ --- sys/sys/proc.h +++ sys/sys/proc.h @@ -294,6 +294,8 @@ #define P_ALTSTACK 0x4000000 /* have alternate signal stack */ #define P_INEXEC 0x8000000 /* Process is in execve(). */ +#define P_SOFTDEP 0x10000000 /* Stuck processing softdep worklist */ + /* * MOVE TO ucred.h? * --- sys/nfs/nfs_vnops.c +++ sys/nfs/nfs_vnops.c @@ -3004,6 +3004,8 @@ */ loop: s = splbio(); + /* DJA don't let soft update do more work */ + p->p_flag |= P_SOFTDEP; for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { nbp = TAILQ_NEXT(bp, b_vnbufs); if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { @@ -3039,8 +3041,11 @@ bp->b_flags |= B_ASYNC | B_WRITEINPROG; splx(s); VOP_BWRITE(bp->b_vp, bp); + /* DJA let someone else go */ + tsleep(p, PZERO, "nfs_flush", hz); goto loop; } + p->p_flag &= ~P_SOFTDEP; splx(s); if (passone) { passone = 0; --- sys/ufs/ffs/ffs_softdep.c +++ sys/ufs/ffs/ffs_softdep.c @@ -4573,7 +4573,7 @@ /* * We never hold up the filesystem syncer process. */ - if (p == filesys_syncer) + if (p == filesys_syncer || (p->p_flag & P_SOFTDEP)) return (0); /* * First check to see if the work list has gotten backlogged. @@ -4585,8 +4585,10 @@ if (num_on_worklist > max_softdeps / 10) { if (islocked) FREE_LOCK(&lk); + p->p_flag |= P_SOFTDEP; process_worklist_item(NULL, LK_NOWAIT); process_worklist_item(NULL, LK_NOWAIT); + p->p_flag &= ~P_SOFTDEP; stat_worklist_push += 2; if (islocked) ACQUIRE_LOCK(&lk);