diff --git a/sys/netbt/hci_socket.c b/sys/netbt/hci_socket.c --- a/sys/netbt/hci_socket.c +++ b/sys/netbt/hci_socket.c @@ -86,6 +86,8 @@ LIST_HEAD(hci_pcb_list, hci_pcb) hci_pcb = LIST_HEAD_INITIALIZER(hci_pcb); +struct lock hci_pcb_lock = LOCK_INITIALIZER("hci_pcb", 0, 0); + /* sysctl defaults */ int hci_sendspace = HCI_CMD_PKT_SIZE; int hci_recvspace = 4096; @@ -573,7 +575,9 @@ so->so_pcb = NULL; sofree(so); /* remove pcb ref */ + lockmgr(&hci_pcb_lock, LK_EXCLUSIVE); LIST_REMOVE(pcb, hp_next); + lockmgr(&hci_pcb_lock, LK_RELEASE); kfree(pcb, M_PCB); error = 0; } @@ -652,9 +656,9 @@ hci_filter_set(HCI_EVENT_COMMAND_STATUS, &pcb->hp_efilter); hci_filter_set(HCI_EVENT_PKT, &pcb->hp_pfilter); - crit_enter(); + lockmgr(&hci_pcb_lock, LK_EXCLUSIVE); LIST_INSERT_HEAD(&hci_pcb, pcb, hp_next); - crit_exit(); + lockmgr(&hci_pcb_lock, LK_RELEASE); error = 0; out: lwkt_replymsg(&msg->attach.base.lmsg, error); @@ -932,6 +936,7 @@ sa.bt_family = AF_BLUETOOTH; bdaddr_copy(&sa.bt_bdaddr, &unit->hci_bdaddr); + lockmgr(&hci_pcb_lock, LK_SHARED); LIST_FOREACH(pcb, &hci_pcb, hp_next) { /* * filter according to source address @@ -1009,6 +1014,7 @@ m_freem(m0); } } + lockmgr(&hci_pcb_lock, LK_RELEASE); } struct pr_usrreqs hci_usrreqs = {