From owner-svn-src-head@FreeBSD.ORG Thu Jan 27 16:10:25 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B09021065696; Thu, 27 Jan 2011 16:10:25 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 855BF8FC14; Thu, 27 Jan 2011 16:10:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p0RGAPDd022604; Thu, 27 Jan 2011 16:10:25 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p0RGAPPC022602; Thu, 27 Jan 2011 16:10:25 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201101271610.p0RGAPPC022602@svn.freebsd.org> From: Konstantin Belousov Date: Thu, 27 Jan 2011 16:10:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r217946 - head/sys/dev/md X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Jan 2011 16:10:25 -0000 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);