Lines Matching defs:po

191 static int pmclog_get_buffer(struct pmc_owner *po);
193 static void pmclog_release(struct pmc_owner *po);
194 static uint32_t *pmclog_reserve(struct pmc_owner *po, int length);
195 static void pmclog_schedule_io(struct pmc_owner *po);
196 static void pmclog_stop_kthread(struct pmc_owner *po);
207 pmclog_get_buffer(struct pmc_owner *po)
211 mtx_assert(&po->po_mtx, MA_OWNED);
213 KASSERT(po->po_curbuf == NULL,
214 ("[pmclog,%d] po=%p current buffer still valid", __LINE__, po));
221 PMCDBG2(LOG,GTB,1, "po=%p plb=%p", po, plb);
227 ("[pmclog,%d] po=%p buffer invariants: ptr=%p "
228 "base=%p fence=%p", __LINE__, po, plb->plb_ptr,
232 po->po_curbuf = plb;
244 struct pmc_owner *po;
264 pmclog_proc_ignite(void *handle, struct pmc_owner *po)
271 MPASS(ia->po == NULL);
274 if (po == NULL) {
277 ia->po = po;
278 KASSERT(po->po_kthread == NULL,
279 ("[pmclog,%d] po=%p kthread (%p) already present",
280 __LINE__, po, po->po_kthread));
281 po->po_kthread = ia->kthr;
300 struct pmc_owner *po;
322 while (ia->po == NULL && !ia->exit)
330 MPASS(ia->po != NULL);
331 po = ia->po;
337 p = po->po_owner;
344 PMCDBG2(LOG,INI,1, "po=%p kt=%p", po, po->po_kthread);
345 KASSERT(po->po_kthread == curthread->td_proc,
346 ("[pmclog,%d] proc mismatch po=%p po/kt=%p curproc=%p", __LINE__,
347 po, po->po_kthread, curthread->td_proc));
363 if ((po->po_flags & PMC_PO_OWNS_LOGFILE) == 0)
367 mtx_lock_spin(&po->po_mtx);
368 if ((lb = TAILQ_FIRST(&po->po_logbuffers)) == NULL) {
369 mtx_unlock_spin(&po->po_mtx);
372 if (po->po_flags & PMC_PO_SHUTDOWN)
375 (void) msleep(po, &pmc_kthread_mtx, PWAIT,
380 TAILQ_REMOVE(&po->po_logbuffers, lb, plb_next);
381 mtx_unlock_spin(&po->po_mtx);
387 PMCDBG3(LOG,WRI,2, "po=%p base=%p ptr=%p", po,
404 error = fo_write(po->po_file, &auio, ownercred, 0, td);
416 po->po_error = error; /* save for flush log */
418 PMCDBG2(LOG,WRI,2, "po=%p error=%d", po, error);
435 wakeup_one(po->po_kthread);
436 po->po_kthread = NULL;
463 pmclog_release(struct pmc_owner *po)
465 KASSERT(po->po_curbuf->plb_ptr >= po->po_curbuf->plb_base,
466 ("[pmclog,%d] buffer invariants po=%p ptr=%p base=%p", __LINE__,
467 po, po->po_curbuf->plb_ptr, po->po_curbuf->plb_base));
468 KASSERT(po->po_curbuf->plb_ptr <= po->po_curbuf->plb_fence,
469 ("[pmclog,%d] buffer invariants po=%p ptr=%p fenc=%p", __LINE__,
470 po, po->po_curbuf->plb_ptr, po->po_curbuf->plb_fence));
473 if (po->po_curbuf->plb_ptr >= po->po_curbuf->plb_fence)
474 pmclog_schedule_io(po);
476 mtx_unlock_spin(&po->po_mtx);
478 PMCDBG1(LOG,REL,1, "po=%p", po);
486 * available. Non-null returns do so with the po mutex locked. The
492 pmclog_reserve(struct pmc_owner *po, int length)
498 PMCDBG2(LOG,ALL,1, "po=%p len=%d", po, length);
503 mtx_lock_spin(&po->po_mtx);
506 if (po->po_flags & PMC_PO_SHUTDOWN) {
507 mtx_unlock_spin(&po->po_mtx);
511 if (po->po_curbuf == NULL)
512 if (pmclog_get_buffer(po) != 0) {
513 mtx_unlock_spin(&po->po_mtx);
517 KASSERT(po->po_curbuf != NULL,
518 ("[pmclog,%d] po=%p no current buffer", __LINE__, po));
520 KASSERT(po->po_curbuf->plb_ptr >= po->po_curbuf->plb_base &&
521 po->po_curbuf->plb_ptr <= po->po_curbuf->plb_fence,
522 ("[pmclog,%d] po=%p buffer invariants: ptr=%p base=%p fence=%p",
523 __LINE__, po, po->po_curbuf->plb_ptr, po->po_curbuf->plb_base,
524 po->po_curbuf->plb_fence));
526 oldptr = (uintptr_t) po->po_curbuf->plb_ptr;
530 ("[pmclog,%d] po=%p Null log buffer pointer", __LINE__, po));
536 if (newptr <= (uintptr_t) po->po_curbuf->plb_fence) {
537 po->po_curbuf->plb_ptr = (char *) newptr;
545 pmclog_schedule_io(po);
547 if (pmclog_get_buffer(po) != 0) {
548 mtx_unlock_spin(&po->po_mtx);
552 KASSERT(po->po_curbuf != NULL,
553 ("[pmclog,%d] po=%p no current buffer", __LINE__, po));
555 KASSERT(po->po_curbuf->plb_ptr != NULL,
558 KASSERT(po->po_curbuf->plb_ptr == po->po_curbuf->plb_base &&
559 po->po_curbuf->plb_ptr <= po->po_curbuf->plb_fence,
560 ("[pmclog,%d] po=%p buffer invariants: ptr=%p base=%p fence=%p",
561 __LINE__, po, po->po_curbuf->plb_ptr, po->po_curbuf->plb_base,
562 po->po_curbuf->plb_fence));
564 oldptr = (uintptr_t) po->po_curbuf->plb_ptr;
582 pmclog_schedule_io(struct pmc_owner *po)
584 KASSERT(po->po_curbuf != NULL,
585 ("[pmclog,%d] schedule_io with null buffer po=%p", __LINE__, po));
587 KASSERT(po->po_curbuf->plb_ptr >= po->po_curbuf->plb_base,
588 ("[pmclog,%d] buffer invariants po=%p ptr=%p base=%p", __LINE__,
589 po, po->po_curbuf->plb_ptr, po->po_curbuf->plb_base));
590 KASSERT(po->po_curbuf->plb_ptr <= po->po_curbuf->plb_fence,
591 ("[pmclog,%d] buffer invariants po=%p ptr=%p fenc=%p", __LINE__,
592 po, po->po_curbuf->plb_ptr, po->po_curbuf->plb_fence));
594 PMCDBG1(LOG,SIO, 1, "po=%p", po);
596 mtx_assert(&po->po_mtx, MA_OWNED);
602 TAILQ_INSERT_TAIL(&po->po_logbuffers, po->po_curbuf, plb_next);
603 po->po_curbuf = NULL;
604 wakeup_one(po);
612 pmclog_stop_kthread(struct pmc_owner *po)
616 po->po_flags &= ~PMC_PO_OWNS_LOGFILE;
617 if (po->po_kthread != NULL) {
618 PROC_LOCK(po->po_kthread);
619 kern_psignal(po->po_kthread, SIGHUP);
620 PROC_UNLOCK(po->po_kthread);
622 wakeup_one(po);
623 while (po->po_kthread)
624 msleep(po->po_kthread, &pmc_kthread_mtx, PPAUSE, "pmckstp", 0);
633 * Configure a log file for pmc owner 'po'.
640 pmclog_configure_log(struct pmc_mdep *md, struct pmc_owner *po, int logfd)
647 PMCDBG2(LOG,CFG,1, "config po=%p logfd=%d", po, logfd);
649 p = po->po_owner;
652 if (po->po_flags & PMC_PO_OWNS_LOGFILE)
655 KASSERT(po->po_file == NULL,
656 ("[pmclog,%d] po=%p file (%p) already present", __LINE__, po,
657 po->po_file));
661 cap_rights_init(&rights, CAP_WRITE), &po->po_file);
666 po->po_flags |= PMC_PO_OWNS_LOGFILE;
674 PMCLOG_RESERVE_WITH_ERROR(po, INITIALIZE,
678 PMCLOG_DESPATCH(po);
683 KASSERT(po->po_kthread == NULL, ("[pmclog,%d] po=%p kthread not "
684 "stopped", __LINE__, po));
686 if (po->po_file)
687 (void) fdrop(po->po_file, curthread);
688 po->po_file = NULL; /* clear file and error state */
689 po->po_error = 0;
690 po->po_flags &= ~PMC_PO_OWNS_LOGFILE;
702 pmclog_deconfigure_log(struct pmc_owner *po)
707 PMCDBG1(LOG,CFG,1, "de-config po=%p", po);
709 if ((po->po_flags & PMC_PO_OWNS_LOGFILE) == 0)
712 KASSERT(po->po_sscount == 0,
713 ("[pmclog,%d] po=%p still owning SS PMCs", __LINE__, po));
714 KASSERT(po->po_file != NULL,
715 ("[pmclog,%d] po=%p no log file", __LINE__, po));
718 pmclog_stop_kthread(po);
720 KASSERT(po->po_kthread == NULL,
721 ("[pmclog,%d] po=%p kthread not stopped", __LINE__, po));
724 while ((lb = TAILQ_FIRST(&po->po_logbuffers)) != NULL) {
725 TAILQ_REMOVE(&po->po_logbuffers, lb, plb_next);
733 if ((lb = po->po_curbuf) != NULL) {
741 if (po->po_file != NULL) {
742 error = fdrop(po->po_file, curthread);
743 po->po_file = NULL;
746 po->po_error = 0;
756 pmclog_flush(struct pmc_owner *po)
761 PMCDBG1(LOG,FLS,1, "po=%p", po);
767 if (po->po_error)
768 return (po->po_error);
776 if ((po->po_flags & PMC_PO_OWNS_LOGFILE) == 0) {
784 mtx_lock_spin(&po->po_mtx);
785 lb = po->po_curbuf;
787 pmclog_schedule_io(po);
790 mtx_unlock_spin(&po->po_mtx);
799 pmclog_close(struct pmc_owner *po)
802 PMCDBG1(LOG,CLO,1, "po=%p", po);
804 pmclog_process_closelog(po);
811 mtx_lock_spin(&po->po_mtx);
812 if (po->po_curbuf)
813 pmclog_schedule_io(po);
815 wakeup_one(po);
816 mtx_unlock_spin(&po->po_mtx);
822 po->po_flags |= PMC_PO_SHUTDOWN;
834 struct pmc_owner *po;
841 po = pm->pm_owner;
843 PMCLOG_RESERVE(po, CALLCHAIN, recordlen);
849 PMCLOG_DESPATCH(po);
853 pmclog_process_closelog(struct pmc_owner *po)
855 PMCLOG_RESERVE(po,CLOSELOG,sizeof(struct pmclog_closelog));
856 PMCLOG_DESPATCH(po);
860 pmclog_process_dropnotify(struct pmc_owner *po)
862 PMCLOG_RESERVE(po,DROPNOTIFY,sizeof(struct pmclog_dropnotify));
863 PMCLOG_DESPATCH(po);
867 pmclog_process_map_in(struct pmc_owner *po, pid_t pid, uintfptr_t start,
878 PMCLOG_RESERVE(po, MAP_IN, recordlen);
882 PMCLOG_DESPATCH(po);
886 pmclog_process_map_out(struct pmc_owner *po, pid_t pid, uintfptr_t start,
891 PMCLOG_RESERVE(po, MAP_OUT, sizeof(struct pmclog_map_out));
895 PMCLOG_DESPATCH(po);
901 struct pmc_owner *po;
904 po = pm->pm_owner;
909 PMCLOG_RESERVE(po, PMCALLOCATEDYN,
920 PMCLOG_DESPATCH(po);
922 PMCLOG_RESERVE(po, PMCALLOCATE,
927 PMCLOG_DESPATCH(po);
935 struct pmc_owner *po;
939 po = pm->pm_owner;
944 PMCLOG_RESERVE(po, PMCATTACH, recordlen);
948 PMCLOG_DESPATCH(po);
954 struct pmc_owner *po;
958 po = pm->pm_owner;
960 PMCLOG_RESERVE(po, PMCDETACH, sizeof(struct pmclog_pmcdetach));
963 PMCLOG_DESPATCH(po);
973 struct pmc_owner *po;
981 po = pm->pm_owner;
983 PMCLOG_RESERVE(po, PROCCSW, sizeof(struct pmclog_proccsw));
987 PMCLOG_DESPATCH(po);
991 pmclog_process_procexec(struct pmc_owner *po, pmc_id_t pmid, pid_t pid,
996 PMCDBG3(LOG,EXC,1,"po=%p pid=%d path=\"%s\"", po, pid, path);
1001 PMCLOG_RESERVE(po, PROCEXEC, recordlen);
1006 PMCLOG_DESPATCH(po);
1017 struct pmc_owner *po;
1023 po = pm->pm_owner;
1025 PMCLOG_RESERVE(po, PROCEXIT, sizeof(struct pmclog_procexit));
1029 PMCLOG_DESPATCH(po);
1037 pmclog_process_procfork(struct pmc_owner *po, pid_t oldpid, pid_t newpid)
1039 PMCLOG_RESERVE(po, PROCFORK, sizeof(struct pmclog_procfork));
1042 PMCLOG_DESPATCH(po);
1050 pmclog_process_sysexit(struct pmc_owner *po, pid_t pid)
1052 PMCLOG_RESERVE(po, SYSEXIT, sizeof(struct pmclog_sysexit));
1054 PMCLOG_DESPATCH(po);
1062 pmclog_process_userlog(struct pmc_owner *po, struct pmc_op_writelog *wl)
1066 PMCDBG2(LOG,WRI,1, "writelog po=%p ud=0x%x", po, wl->pm_userdata);
1070 PMCLOG_RESERVE_WITH_ERROR(po, USERDATA,
1073 PMCLOG_DESPATCH(po);