svn commit: r196210 - in stable/8/sys: . amd64/include/xen
cddl/contrib/opensolaris contrib/dev/acpica contrib/pf dev/ata
dev/cxgb
dev/sound/usb dev/usb dev/usb/controller dev/usb/input dev/usb/mis...
pluknet
pluknet at gmail.com
Mon Sep 7 09:37:27 UTC 2009
2009/8/14 Konstantin Belousov <kib at freebsd.org>:
> Author: kib
> Date: Fri Aug 14 11:22:09 2009
> New Revision: 196210
> URL: http://svn.freebsd.org/changeset/base/196210
>
> Log:
> MFC r196206:
> Take the number of allocated freeblks into consideration for
> softdep_slowdown(), to prevent kernel memory exhaustioni on
> mass-truncation.
>
> Approved by: re (rwatson)
>
[...]
Hi.
Is it scheduled to be merged to stable/7 (and even to stable/6, which
also has this issue)?
Thanks.
> Modified: stable/8/sys/ufs/ffs/ffs_softdep.c
> ==============================================================================
> --- stable/8/sys/ufs/ffs/ffs_softdep.c Fri Aug 14 11:17:34 2009 (r196209)
> +++ stable/8/sys/ufs/ffs/ffs_softdep.c Fri Aug 14 11:22:09 2009 (r196210)
> @@ -663,6 +663,8 @@ static int req_clear_inodedeps; /* synce
> static int req_clear_remove; /* syncer process flush some freeblks */
> #define FLUSH_REMOVE 2
> #define FLUSH_REMOVE_WAIT 3
> +static long num_freeblkdep; /* number of freeblks workitems allocated */
> +
> /*
> * runtime statistics
> */
> @@ -2223,6 +2225,9 @@ softdep_setup_freeblocks(ip, length, fla
> freeblks->fb_uid = ip->i_uid;
> freeblks->fb_previousinum = ip->i_number;
> freeblks->fb_devvp = ip->i_devvp;
> + ACQUIRE_LOCK(&lk);
> + num_freeblkdep++;
> + FREE_LOCK(&lk);
> extblocks = 0;
> if (fs->fs_magic == FS_UFS2_MAGIC)
> extblocks = btodb(fragroundup(fs, ip->i_din2->di_extsize));
> @@ -2815,6 +2820,7 @@ handle_workitem_freeblocks(freeblks, fla
>
> ACQUIRE_LOCK(&lk);
> WORKITEM_FREE(freeblks, D_FREEBLKS);
> + num_freeblkdep--;
> FREE_LOCK(&lk);
> }
>
> @@ -5768,7 +5774,8 @@ softdep_slowdown(vp)
> max_softdeps_hard = max_softdeps * 11 / 10;
> if (num_dirrem < max_softdeps_hard / 2 &&
> num_inodedep < max_softdeps_hard &&
> - VFSTOUFS(vp->v_mount)->um_numindirdeps < maxindirdeps) {
> + VFSTOUFS(vp->v_mount)->um_numindirdeps < maxindirdeps &&
> + num_freeblkdep < max_softdeps_hard) {
> FREE_LOCK(&lk);
> return (0);
> }
--
wbr,
pluknet
More information about the freebsd-stable
mailing list