Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Jan 2011 16:10:25 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r217946 - head/sys/dev/md
Message-ID:  <201101271610.p0RGAPPC022602@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Thu Jan 27 16:10:25 2011
New Revision: 217946
URL: http://svn.freebsd.org/changeset/base/217946

Log:
  Add support for BIO_DELETE on swap-backed md(4). In the case of BIO_DELETE
  covering the whole page, free the page. Otherwise, clear the region and
  mark it clean. Not marking the page dirty could reinstantiate cleared
  data, but it is allowed by BIO_DELETE specification and saves unneeded
  write to swap.
  
  Reviewed by:	alc
  Tested by:	pho
  MFC after:	2 weeks

Modified:
  head/sys/dev/md/md.c

Modified: head/sys/dev/md/md.c
==============================================================================
--- head/sys/dev/md/md.c	Thu Jan 27 15:27:07 2011	(r217945)
+++ head/sys/dev/md/md.c	Thu Jan 27 16:10:25 2011	(r217946)
@@ -649,7 +649,6 @@ mdstart_swap(struct md_s *sc, struct bio
 			}
 			bcopy(p, (void *)(sf_buf_kva(sf) + offs), len);
 			m->valid = VM_PAGE_BITS_ALL;
-#if 0
 		} else if (bp->bio_cmd == BIO_DELETE) {
 			if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL)
 				rv = vm_pager_get_pages(sc->object, &m, 1, 0);
@@ -659,16 +658,21 @@ mdstart_swap(struct md_s *sc, struct bio
 				vm_page_wakeup(m);
 				break;
 			}
-			bzero((void *)(sf_buf_kva(sf) + offs), len);
-			vm_page_dirty(m);
-			m->valid = VM_PAGE_BITS_ALL;
-#endif
+			if (len != PAGE_SIZE) {
+				bzero((void *)(sf_buf_kva(sf) + offs), len);
+				vm_page_clear_dirty(m, offs, len);
+				m->valid = VM_PAGE_BITS_ALL;
+			} else
+				vm_pager_page_unswapped(m);
 		}
 		sf_buf_free(sf);
 		sched_unpin();
 		vm_page_wakeup(m);
 		vm_page_lock(m);
-		vm_page_activate(m);
+		if (bp->bio_cmd == BIO_DELETE && len == PAGE_SIZE)
+			vm_page_free(m);
+		else
+			vm_page_activate(m);
 		vm_page_unlock(m);
 		if (bp->bio_cmd == BIO_WRITE)
 			vm_page_dirty(m);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101271610.p0RGAPPC022602>