Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Sep 2017 22:40:57 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r323630 - head/sys/dev/cxgbe/tom
Message-ID:  <201709152240.v8FMevvt009106@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Sep 15 22:40:57 2017
New Revision: 323630
URL: https://svnweb.freebsd.org/changeset/base/323630

Log:
  Avoid reusing the wrong buffer for a DDP AIO request.
  
  To optimize the case of ping-ponging between two buffers, the DDP code
  caches the last two buffers used keeping the pages wired and page pods
  stored in the NIC's RAM.  If a new aio_read() request uses one of the
  same buffers, then the work of holding pages, etc. can be avoided.
  However, the starting virtual address of an aio buffer was not saved,
  only the page count, length, and initial page offset.  Thus, an
  aio_read() request could match a different buffer in the address
  space.  (Earlier during development vm_fault_hold_quick_pages() was
  always called and the vm_page_t values were compared, but that was
  eventually removed without being adequately replaced.)  Fix by storing
  the starting virtual address and comparing that (along with other
  fields) to determine if a buffer can be reused.
  
  MFC after:	3 days
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/dev/cxgbe/tom/t4_ddp.c
  head/sys/dev/cxgbe/tom/t4_tom.h

Modified: head/sys/dev/cxgbe/tom/t4_ddp.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_ddp.c	Fri Sep 15 20:58:52 2017	(r323629)
+++ head/sys/dev/cxgbe/tom/t4_ddp.c	Fri Sep 15 22:40:57 2017	(r323630)
@@ -1277,7 +1277,8 @@ pscmp(struct pageset *ps, struct vmspace *vm, vm_offse
     int pgoff, int len)
 {
 
-	if (ps->npages != npages || ps->offset != pgoff || ps->len != len)
+	if (ps->start != start || ps->npages != npages ||
+	    ps->offset != pgoff || ps->len != len)
 		return (1);
 
 	return (ps->vm != vm || ps->vm_timestamp != vm->vm_map.timestamp);
@@ -1378,6 +1379,7 @@ hold_aio(struct toepcb *toep, struct kaiocb *job, stru
 	ps->len = job->uaiocb.aio_nbytes;
 	atomic_add_int(&vm->vm_refcnt, 1);
 	ps->vm = vm;
+	ps->start = start;
 
 	CTR5(KTR_CXGBE, "%s: tid %d, new pageset %p for job %p, npages %d",
 	    __func__, toep->tid, ps, job, ps->npages);

Modified: head/sys/dev/cxgbe/tom/t4_tom.h
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_tom.h	Fri Sep 15 20:58:52 2017	(r323629)
+++ head/sys/dev/cxgbe/tom/t4_tom.h	Fri Sep 15 22:40:57 2017	(r323630)
@@ -112,6 +112,7 @@ struct pageset {
 	int len;
 	struct ppod_reservation prsv;
 	struct vmspace *vm;
+	vm_offset_t start;
 	u_int vm_timestamp;
 };
 



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