Use a mutex rather than lockmgr. Approved by Andrew Doran.

This commit is contained in:
xtraeme 2007-03-06 01:09:42 +00:00
parent a92d5c5157
commit 27d2cb4e20
2 changed files with 19 additions and 18 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: agp.c,v 1.45 2007/03/04 06:02:15 christos Exp $ */ /* $NetBSD: agp.c,v 1.46 2007/03/06 01:09:42 xtraeme Exp $ */
/*- /*-
* Copyright (c) 2000 Doug Rabson * Copyright (c) 2000 Doug Rabson
@ -65,7 +65,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: agp.c,v 1.45 2007/03/04 06:02:15 christos Exp $"); __KERNEL_RCSID(0, "$NetBSD: agp.c,v 1.46 2007/03/06 01:09:42 xtraeme Exp $");
#include <sys/param.h> #include <sys/param.h>
#include <sys/systm.h> #include <sys/systm.h>
@ -77,6 +77,7 @@ __KERNEL_RCSID(0, "$NetBSD: agp.c,v 1.45 2007/03/04 06:02:15 christos Exp $");
#include <sys/fcntl.h> #include <sys/fcntl.h>
#include <sys/agpio.h> #include <sys/agpio.h>
#include <sys/proc.h> #include <sys/proc.h>
#include <sys/mutex.h>
#include <uvm/uvm_extern.h> #include <uvm/uvm_extern.h>
@ -276,10 +277,10 @@ agpattach(struct device *parent, struct device *self, void *aux)
sc->as_maxmem = agp_max[i][1] << 20U; sc->as_maxmem = agp_max[i][1] << 20U;
/* /*
* The lock is used to prevent re-entry to * The mutex is used to prevent re-entry to
* agp_generic_bind_memory() since that function can sleep. * agp_generic_bind_memory() since that function can sleep.
*/ */
lockinit(&sc->as_lock, PZERO|PCATCH, "agplk", 0, 0); mutex_init(&sc->as_mtx, MUTEX_DRIVER, IPL_NONE);
TAILQ_INIT(&sc->as_memory); TAILQ_INIT(&sc->as_memory);
@ -351,7 +352,7 @@ agp_free_gatt(struct agp_softc *sc, struct agp_gatt *gatt)
int int
agp_generic_detach(struct agp_softc *sc) agp_generic_detach(struct agp_softc *sc)
{ {
lockmgr(&sc->as_lock, LK_DRAIN, 0); mutex_destroy(&sc->as_mtx);
agp_flush_cache(); agp_flush_cache();
return 0; return 0;
} }
@ -492,11 +493,11 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
bus_addr_t pa; bus_addr_t pa;
int contigpages, nseg; int contigpages, nseg;
lockmgr(&sc->as_lock, LK_EXCLUSIVE, 0); mutex_enter(&sc->as_mtx);
if (mem->am_is_bound) { if (mem->am_is_bound) {
printf("%s: memory already bound\n", sc->as_dev.dv_xname); printf("%s: memory already bound\n", sc->as_dev.dv_xname);
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return EINVAL; return EINVAL;
} }
@ -505,7 +506,7 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
|| offset + mem->am_size > AGP_GET_APERTURE(sc)) { || offset + mem->am_size > AGP_GET_APERTURE(sc)) {
printf("%s: binding memory at bad offset %#lx\n", printf("%s: binding memory at bad offset %#lx\n",
sc->as_dev.dv_xname, (unsigned long) offset); sc->as_dev.dv_xname, (unsigned long) offset);
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return EINVAL; return EINVAL;
} }
@ -528,7 +529,7 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
nseg = (mem->am_size / (contigpages * PAGE_SIZE)) + 1; nseg = (mem->am_size / (contigpages * PAGE_SIZE)) + 1;
segs = malloc(nseg * sizeof *segs, M_AGP, M_WAITOK); segs = malloc(nseg * sizeof *segs, M_AGP, M_WAITOK);
if (segs == NULL) { if (segs == NULL) {
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return ENOMEM; return ENOMEM;
} }
if (bus_dmamem_alloc(sc->as_dmat, mem->am_size, PAGE_SIZE, 0, if (bus_dmamem_alloc(sc->as_dmat, mem->am_size, PAGE_SIZE, 0,
@ -557,7 +558,7 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
} }
if (contigpages == 0) { if (contigpages == 0) {
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return ENOMEM; return ENOMEM;
} }
@ -596,7 +597,7 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
bus_dmamem_free(sc->as_dmat, mem->am_dmaseg, bus_dmamem_free(sc->as_dmat, mem->am_dmaseg,
mem->am_nseg); mem->am_nseg);
free(mem->am_dmaseg, M_AGP); free(mem->am_dmaseg, M_AGP);
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return error; return error;
} }
} }
@ -617,7 +618,7 @@ agp_generic_bind_memory(struct agp_softc *sc, struct agp_memory *mem,
mem->am_offset = offset; mem->am_offset = offset;
mem->am_is_bound = 1; mem->am_is_bound = 1;
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return 0; return 0;
} }
@ -627,11 +628,11 @@ agp_generic_unbind_memory(struct agp_softc *sc, struct agp_memory *mem)
{ {
int i; int i;
lockmgr(&sc->as_lock, LK_EXCLUSIVE, 0); mutex_enter(&sc->as_mtx);
if (!mem->am_is_bound) { if (!mem->am_is_bound) {
printf("%s: memory is not bound\n", sc->as_dev.dv_xname); printf("%s: memory is not bound\n", sc->as_dev.dv_xname);
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return EINVAL; return EINVAL;
} }
@ -655,7 +656,7 @@ agp_generic_unbind_memory(struct agp_softc *sc, struct agp_memory *mem)
mem->am_offset = 0; mem->am_offset = 0;
mem->am_is_bound = 0; mem->am_is_bound = 0;
lockmgr(&sc->as_lock, LK_RELEASE, 0); mutex_exit(&sc->as_mtx);
return 0; return 0;
} }

View File

@ -1,4 +1,4 @@
/* $NetBSD: agpvar.h,v 1.13 2007/03/04 06:02:16 christos Exp $ */ /* $NetBSD: agpvar.h,v 1.14 2007/03/06 01:09:42 xtraeme Exp $ */
/*- /*-
* Copyright (c) 2000 Doug Rabson * Copyright (c) 2000 Doug Rabson
@ -32,7 +32,7 @@
#define _PCI_AGPVAR_H_ #define _PCI_AGPVAR_H_
#include <sys/mallocvar.h> #include <sys/mallocvar.h>
#include <sys/lock.h> #include <sys/mutex.h>
struct agpbus_attach_args { struct agpbus_attach_args {
char *_apa_busname; /* XXX placeholder */ char *_apa_busname; /* XXX placeholder */
@ -144,7 +144,7 @@ struct agp_softc {
#if 0 #if 0
dev_t as_devnode; /* from make_dev */ dev_t as_devnode; /* from make_dev */
#endif #endif
struct lock as_lock; /* lock for access to GATT */ kmutex_t as_mtx; /* mutex for access to GATT */
struct agp_methods *as_methods; /* chipset-dependent API */ struct agp_methods *as_methods; /* chipset-dependent API */
void *as_chipc; /* chipset-dependent state */ void *as_chipc; /* chipset-dependent state */
pci_chipset_tag_t as_pc; pci_chipset_tag_t as_pc;