Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Sep 2006 15:42:10 +1000
From:      "Jan Mikkelsen" <janm@transactionware.com>
To:        <freebsd-amd64@freebsd.org>
Subject:   sym(4) and amd64
Message-ID:  <011c01c6dbae$59f32fe0$c801a8c0@transactionware.com>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.

------=_NextPart_000_011D_01C6DC02.2B9F3FE0
Content-Type: text/plain;
	charset="US-ASCII"
Content-Transfer-Encoding: 7bit



I have been looking at the sym(4) problems on amd64, and have come up with
the attached patch.  See also amd/89550.

Would someone mind taking a look at this to see that it makes sense?

Thanks,

Jan Mikkelsen

------=_NextPart_000_011D_01C6DC02.2B9F3FE0
Content-Type: application/octet-stream;
	name="sym_hipd.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="sym_hipd.diff"

*** FreeBSD/src/sys/dev/sym/sym_hipd.c	Tue Aug  8 00:43:31 2006=0A=
--- /home/janm/sym_hipd.c	Tue Sep 19 15:27:55 2006=0A=
***************=0A=
*** 439,445 ****=0A=
  #define free_pages(p)		free((p), M_DEVBUF)=0A=
  #else=0A=
  #define get_pages()		contigmalloc(MEMO_CLUSTER_SIZE, M_DEVBUF, \=0A=
! 				    0, 0, 1LL << 32, PAGE_SIZE, 1LL << 32)=0A=
  #define free_pages(p)		contigfree((p), MEMO_CLUSTER_SIZE, M_DEVBUF)=0A=
  #endif=0A=
  =0A=
--- 439,446 ----=0A=
  #define free_pages(p)		free((p), M_DEVBUF)=0A=
  #else=0A=
  #define get_pages()		contigmalloc(MEMO_CLUSTER_SIZE, M_DEVBUF, \=0A=
! 				    0, 0, 1LL << 32, PAGE_SIZE, \=0A=
! 				    MEMO_CLUSTER_SIZE)=0A=
  #define free_pages(p)		contigfree((p), MEMO_CLUSTER_SIZE, M_DEVBUF)=0A=
  #endif=0A=
  =0A=
***************=0A=
*** 453,458 ****=0A=
--- 454,462 ----=0A=
  	struct m_vtob	*next;=0A=
  	bus_dmamap_t	dmamap;	/* Map for this chunk */=0A=
  	m_addr_t	vaddr;	/* Virtual address */=0A=
+ #if PAGE_SIZE < MEMO_CLUSTER_SIZE=0A=
+ 	m_addr_t	adjusted_vaddr;	/* Virtual address adjusted for buddy */=0A=
+ #endif=0A=
  	m_addr_t	baddr;	/* Bus physical address */=0A=
  } m_vtob_s;=0A=
  /* Hash this stuff a bit to speed up translations */=0A=
***************=0A=
*** 674,685 ****=0A=
  	if (bus_dmamem_alloc(mp->dmat, &vaddr,=0A=
  			      BUS_DMA_NOWAIT, &vbp->dmamap))=0A=
  		goto out_err;=0A=
  	bus_dmamap_load(mp->dmat, vbp->dmamap, vaddr,=0A=
  			MEMO_CLUSTER_SIZE, getbaddrcb, &baddr, 0);=0A=
  	if (baddr) {=0A=
! 		int hc =3D VTOB_HASH_CODE(vaddr);=0A=
  		vbp->vaddr =3D (m_addr_t) vaddr;=0A=
  		vbp->baddr =3D (m_addr_t) baddr;=0A=
  		vbp->next =3D mp->vtob[hc];=0A=
  		mp->vtob[hc] =3D vbp;=0A=
  		++mp->nump;=0A=
--- 678,711 ----=0A=
  	if (bus_dmamem_alloc(mp->dmat, &vaddr,=0A=
  			      BUS_DMA_NOWAIT, &vbp->dmamap))=0A=
  		goto out_err;=0A=
+ #if PAGE_SIZE < MEMO_CLUSTER_SIZE=0A=
+ 	bus_dmamap_load(mp->dmat, vbp->dmamap, vaddr,=0A=
+ 			MEMO_CLUSTER_SIZE * 2, getbaddrcb, &baddr, 0);=0A=
+ #else=0A=
  	bus_dmamap_load(mp->dmat, vbp->dmamap, vaddr,=0A=
  			MEMO_CLUSTER_SIZE, getbaddrcb, &baddr, 0);=0A=
+ #endif=0A=
  	if (baddr) {=0A=
! 		int hc;=0A=
! =0A=
  		vbp->vaddr =3D (m_addr_t) vaddr;=0A=
  		vbp->baddr =3D (m_addr_t) baddr;=0A=
+ #if PAGE_SIZE < MEMO_CLUSTER_SIZE=0A=
+ 		/*=0A=
+ 		 * Adjusting vaddr is OK here because we do not error out.=0A=
+ 		 * If that changes, the bus_dmamem_free() call below would=0A=
+ 		 * need to be fixed.=0A=
+ 		 *=0A=
+ 		 * This code assumes that we will be at most one page away=0A=
+ 		 * from having things aligned the way we want.=0A=
+ 		 */=0A=
+ =0A=
+ 		if (((m_addr_t) vaddr & ~MEMO_CLUSTER_MASK) !=3D (m_addr_t) vaddr)=0A=
+ 			vaddr =3D (void*) ((m_addr_t) vaddr + PAGE_SIZE);=0A=
+ =0A=
+ 		vbp->adjusted_vaddr =3D (m_addr_t) vaddr;=0A=
+ #endif=0A=
+ 	       	hc =3D VTOB_HASH_CODE(vaddr);=0A=
  		vbp->next =3D mp->vtob[hc];=0A=
  		mp->vtob[hc] =3D vbp;=0A=
  		++mp->nump;=0A=
***************=0A=
*** 733,744 ****=0A=
  	mp =3D __sym_calloc(&mp0, sizeof(*mp), "MPOOL");=0A=
  	if (mp) {=0A=
  		mp->dev_dmat =3D dev_dmat;=0A=
! 		if (!bus_dma_tag_create(dev_dmat, 1, MEMO_CLUSTER_SIZE,=0A=
  			       BUS_SPACE_MAXADDR_32BIT,=0A=
  			       BUS_SPACE_MAXADDR_32BIT,=0A=
  			       NULL, NULL, MEMO_CLUSTER_SIZE, 1,=0A=
  			       MEMO_CLUSTER_SIZE, 0,=0A=
  			       busdma_lock_mutex, &Giant, &mp->dmat)) {=0A=
  			mp->getp =3D ___dma_getp;=0A=
  #ifdef	MEMO_FREE_UNUSED=0A=
  			mp->freep =3D ___dma_freep;=0A=
--- 759,779 ----=0A=
  	mp =3D __sym_calloc(&mp0, sizeof(*mp), "MPOOL");=0A=
  	if (mp) {=0A=
  		mp->dev_dmat =3D dev_dmat;=0A=
! #if PAGE_SIZE < MEMO_CLUSTER_SIZE=0A=
! 		if (!bus_dma_tag_create(dev_dmat, 1, MEMO_CLUSTER_SIZE * 2,=0A=
  			       BUS_SPACE_MAXADDR_32BIT,=0A=
+ 			       BUS_SPACE_MAXADDR,=0A=
+ 			       NULL, NULL, MEMO_CLUSTER_SIZE * 2, 1,=0A=
+ 			       MEMO_CLUSTER_SIZE * 2, 0,=0A=
+ 			       busdma_lock_mutex, &Giant, &mp->dmat)) {=0A=
+ #else=0A=
+ 		if (!bus_dma_tag_create(dev_dmat, 1, MEMO_CLUSTER_SIZE,=0A=
  			       BUS_SPACE_MAXADDR_32BIT,=0A=
+ 			       BUS_SPACE_MAXADDR,=0A=
  			       NULL, NULL, MEMO_CLUSTER_SIZE, 1,=0A=
  			       MEMO_CLUSTER_SIZE, 0,=0A=
  			       busdma_lock_mutex, &Giant, &mp->dmat)) {=0A=
+ #endif=0A=
  			mp->getp =3D ___dma_getp;=0A=
  #ifdef	MEMO_FREE_UNUSED=0A=
  			mp->freep =3D ___dma_freep;=0A=
***************=0A=
*** 815,827 ****=0A=
  	mp =3D ___get_dma_pool(dev_dmat);=0A=
  	if (mp) {=0A=
  		vp =3D mp->vtob[hc];=0A=
  		while (vp && (m_addr_t) vp->vaddr !=3D a)=0A=
  			vp =3D vp->next;=0A=
  	}=0A=
  	/* Unlock */=0A=
  	if (!vp)=0A=
  		panic("sym: VTOBUS FAILED!\n");=0A=
! 	return vp ? vp->baddr + (((m_addr_t) m) - a) : 0;=0A=
  }=0A=
  =0A=
  =0A=
--- 850,872 ----=0A=
  	mp =3D ___get_dma_pool(dev_dmat);=0A=
  	if (mp) {=0A=
  		vp =3D mp->vtob[hc];=0A=
+ #if (PAGE_SIZE < MEMO_CLUSTER_SIZE)=0A=
+ 		while (vp && (m_addr_t) vp->adjusted_vaddr !=3D a)=0A=
+ #else=0A=
  		while (vp && (m_addr_t) vp->vaddr !=3D a)=0A=
+ #endif=0A=
  			vp =3D vp->next;=0A=
  	}=0A=
+ =0A=
  	/* Unlock */=0A=
  	if (!vp)=0A=
  		panic("sym: VTOBUS FAILED!\n");=0A=
! #if (PAGE_SIZE < MEMO_CLUSTER_SIZE)=0A=
! 	return vp->baddr + (((m_addr_t) m) - a) +=0A=
! 		(vp->adjusted_vaddr - vp->vaddr);=0A=
! #else=0A=
! 	return vp->baddr + (((m_addr_t) m) - a);=0A=
! #endif=0A=
  }=0A=
  =0A=
  =0A=

------=_NextPart_000_011D_01C6DC02.2B9F3FE0--




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?011c01c6dbae$59f32fe0$c801a8c0>