Page MenuHomeFreeBSD

D19252.id54131.diff
No OneTemporary

D19252.id54131.diff

Index: sys/kern/kern_kcov.c
===================================================================
--- sys/kern/kern_kcov.c
+++ sys/kern/kern_kcov.c
@@ -58,8 +58,9 @@
#include <vm/vm_object.h>
#include <vm/vm_page.h>
#include <vm/vm_pager.h>
+#include <vm/vm_param.h>
-MALLOC_DEFINE(M_KCOV_INFO, "kcovinfo", "KCOV info type");
+MALLOC_DEFINE(M_KCOV, "kcov", "kcov memory");
#define KCOV_ELEMENT_SIZE sizeof(uint64_t)
@@ -122,6 +123,7 @@
struct thread *thread; /* (l) */
vm_object_t bufobj; /* (o) */
vm_offset_t kvaddr; /* (o) */
+ vm_page_t *m; /* (o) */
size_t entries; /* (o) */
size_t bufsize; /* (o) */
kcov_state_t state; /* (s) */
@@ -298,7 +300,7 @@
struct kcov_info *info;
int error;
- info = malloc(sizeof(struct kcov_info), M_KCOV_INFO, M_ZERO | M_WAITOK);
+ info = malloc(sizeof(struct kcov_info), M_KCOV, M_ZERO | M_WAITOK);
info->state = KCOV_STATE_OPEN;
info->thread = NULL;
info->mode = -1;
@@ -347,6 +349,7 @@
info->mmap != false)
return (EINVAL);
+ vm_object_reference(info->bufobj);
info->mmap = true;
*offset = 0;
*object = info->bufobj;
@@ -357,7 +360,6 @@
kcov_alloc(struct kcov_info *info, size_t entries)
{
size_t n, pages;
- vm_page_t *m;
KASSERT(info->kvaddr == 0, ("kcov_alloc: Already have a buffer"));
KASSERT(info->state == KCOV_STATE_OPEN,
@@ -376,16 +378,15 @@
info->bufobj = vm_pager_allocate(OBJT_PHYS, 0, info->bufsize,
PROT_READ | PROT_WRITE, 0, curthread->td_ucred);
- m = malloc(sizeof(*m) * pages, M_TEMP, M_WAITOK);
+ info->m = malloc(sizeof(*info->m) * pages, M_KCOV, M_WAITOK);
VM_OBJECT_WLOCK(info->bufobj);
for (n = 0; n < pages; n++) {
- m[n] = vm_page_grab(info->bufobj, n,
+ info->m[n] = vm_page_grab(info->bufobj, n,
VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_WIRED);
- m[n]->valid = VM_PAGE_BITS_ALL;
+ info->m[n]->valid = VM_PAGE_BITS_ALL;
}
VM_OBJECT_WUNLOCK(info->bufobj);
- pmap_qenter(info->kvaddr, m, pages);
- free(m, M_TEMP);
+ pmap_qenter(info->kvaddr, info->m, pages);
info->entries = entries;
@@ -395,14 +396,24 @@
static void
kcov_free(struct kcov_info *info)
{
+ size_t i;
if (info->kvaddr != 0) {
pmap_qremove(info->kvaddr, info->bufsize / PAGE_SIZE);
kva_free(info->kvaddr, info->bufsize);
}
- if (info->bufobj != NULL && !info->mmap)
+ if (info->bufobj != NULL) {
+ VM_OBJECT_WLOCK(info->bufobj);
+ for (i = 0; i < info->bufsize / PAGE_SIZE; i++) {
+ vm_page_lock(info->m[i]);
+ vm_page_unwire_noq(info->m[i]);
+ vm_page_unlock(info->m[i]);
+ }
+ VM_OBJECT_WUNLOCK(info->bufobj);
+ free(info->m, M_KCOV);
vm_object_deallocate(info->bufobj);
- free(info, M_KCOV_INFO);
+ }
+ free(info, M_KCOV);
}
static int

File Metadata

Mime Type
text/plain
Expires
Tue, Oct 28, 3:18 AM (11 h, 27 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24333871
Default Alt Text
D19252.id54131.diff (2 KB)

Event Timeline