Page MenuHomeFreeBSD

D20863.id59478.diff
No OneTemporary

D20863.id59478.diff

Index: sys/kern/subr_blist.c
===================================================================
--- sys/kern/subr_blist.c
+++ sys/kern/subr_blist.c
@@ -295,7 +295,7 @@
* not be allocated.
*/
daddr_t
-blist_alloc(blist_t bl, int *count, int maxcount)
+blist_alloc(blist_t bl, daddr_t *io_cursor, int *count, int maxcount)
{
daddr_t blk, cursor;
@@ -310,14 +310,14 @@
* non-zero. When the cursor is zero, an allocation failure will
* stop further iterations.
*/
- for (cursor = bl->bl_cursor;; cursor = 0) {
+ for (cursor = *io_cursor;; cursor = 0) {
blk = blst_meta_alloc(bl->bl_root, cursor, count, maxcount,
bl->bl_radix);
if (blk != SWAPBLK_NONE) {
bl->bl_avail -= *count;
- bl->bl_cursor = blk + *count;
- if (bl->bl_cursor == bl->bl_blocks)
- bl->bl_cursor = 0;
+ *io_cursor = blk + *count;
+ if (*io_cursor == bl->bl_blocks)
+ *io_cursor = 0;
return (blk);
}
if (cursor == 0)
@@ -404,8 +404,7 @@
void
blist_print(blist_t bl)
{
- printf("BLIST avail = %jd, cursor = %08jx {\n",
- (uintmax_t)bl->bl_avail, (uintmax_t)bl->bl_cursor);
+ printf("BLIST avail = %jd {\n", (uintmax_t)bl->bl_avail);
if (bl->bl_root->bm_bitmap != 0)
blst_radix_print(bl->bl_root, 0, bl->bl_radix, 4);
Index: sys/sys/blist.h
===================================================================
--- sys/sys/blist.h
+++ sys/sys/blist.h
@@ -81,7 +81,6 @@
daddr_t bl_blocks; /* area of coverage */
daddr_t bl_avail; /* # available blocks */
u_daddr_t bl_radix; /* coverage radix */
- daddr_t bl_cursor; /* next-fit search starts at */
blmeta_t bl_root[1]; /* root of radix tree */
} *blist_t;
@@ -92,7 +91,7 @@
struct sbuf;
-daddr_t blist_alloc(blist_t blist, int *count, int maxcount);
+daddr_t blist_alloc(blist_t blist, daddr_t *cursor, int *count, int maxcount);
daddr_t blist_avail(blist_t blist);
blist_t blist_create(daddr_t blocks, int flags);
void blist_destroy(blist_t blist);
Index: sys/vm/swap_pager.h
===================================================================
--- sys/vm/swap_pager.h
+++ sys/vm/swap_pager.h
@@ -65,6 +65,7 @@
swblk_t sw_first;
swblk_t sw_end;
struct blist *sw_blist;
+ daddr_t sw_cursor; /* next-fit search starts at */
TAILQ_ENTRY(swdevt) sw_list;
sw_strategy_t *sw_strategy;
sw_close_t *sw_close;
Index: sys/vm/swap_pager.c
===================================================================
--- sys/vm/swap_pager.c
+++ sys/vm/swap_pager.c
@@ -702,6 +702,53 @@
object->type = OBJT_DEAD;
}
+static void
+swapdev_trim(struct swdevt *sp)
+{
+ struct stat sb;
+ daddr_t blk;
+ const char *devname;
+ u_long nblks;
+ off_t ioarg[2];
+ int fd, npages, mpages;
+
+ /* Give up if there's no filename. */
+ if (!vn_isdisk(sp->sw_vp, NULL))
+ return;
+
+ /* Quit if the cursor is too far behind the trimmer. */
+ nblks = sp->sw_nblks;
+ npages = sp->sw_trimmer + nblks - sp->sw_cursor;
+ if (npages % nblks >= nblks / 5)
+ return;
+
+ /* Grab a lot of free space allocated long ago. */
+ npages = 1;
+ mpages = 10000;
+ blk = blist_alloc(sp->sw_blist, &sp->sw_trimmer, &npages, mpages);
+
+ /* Quit if there's nothing free between the trimmer and cursor. */
+ if (blk == SWAPBLK_NONE)
+ return;
+ if ((blk + nblks - sp->sw_cursor) % nblks > nblks / 5) {
+ /* The trim allocation jumped the cursor. Bail out. */
+ blist_free(sp->sw_blist, blk, npages);
+ return;
+ }
+ blk += sp->sw_first;
+ devname = devtoname(sp->sw_vp->v_rdev);
+ fd = open(devname, O_WRONLY);
+ if (fd < 0)
+ errx(1, "Cannot open %s", name);
+ ioarg[0] = blk;
+ ioarg[1] = npages;
+ if (ioctl(fd, DIOCGDELETE, ioarg) != 0)
+ warn("ioctl(DIOCGDELETE)");
+ close(fd);
+ bl -= sp->sw_first;
+ blist_free(sp->sw_blist, blk, npages);
+}
+
/************************************************************************
* SWAP PAGER BITMAP ROUTINES *
************************************************************************/
@@ -737,7 +784,8 @@
if (sp == NULL)
sp = TAILQ_FIRST(&swtailq);
if ((sp->sw_flags & SW_CLOSING) == 0)
- blk = blist_alloc(sp->sw_blist, &npages, mpages);
+ blk = blist_alloc(sp->sw_blist, &sp->sw_cursor,
+ &npages, mpages);
if (blk != SWAPBLK_NONE)
break;
sp = TAILQ_NEXT(sp, sw_list);
@@ -753,6 +801,7 @@
blk += sp->sw_first;
sp->sw_used += npages;
swap_pager_avail -= npages;
+ swapdev_trim(sp);
swp_sizecheck();
swdevhd = TAILQ_NEXT(sp, sw_list);
} else {
@@ -2310,6 +2359,8 @@
sp->sw_flags = flags;
sp->sw_blist = blist_create(nblks, M_WAITOK);
+ sp->sw_cursor = 0;
+ sp->sw_trimmer = 0;
/*
* Do not free the first two block in order to avoid overwriting
* any bsd label at the front of the partition

File Metadata

Mime Type
text/plain
Expires
Sat, Jan 24, 4:06 AM (15 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27888955
Default Alt Text
D20863.id59478.diff (4 KB)

Event Timeline