Merge from vmcontention
This commit is contained in:
parent
950536d7a4
commit
d7dbac82f0
@ -2687,7 +2687,7 @@ ath_txq_qadd(struct ifnet *ifp, struct mbuf *m0)
|
||||
struct mbuf *m;
|
||||
|
||||
/* XXX recursive TX completion -> TX? */
|
||||
ATH_TX_UNLOCK_ASSERT(sc);
|
||||
ATH_TX_IC_UNLOCK_ASSERT(sc);
|
||||
|
||||
/*
|
||||
* We grab the node pointer, but we don't deref
|
||||
@ -2749,7 +2749,7 @@ ath_txq_qadd(struct ifnet *ifp, struct mbuf *m0)
|
||||
* into the driver.
|
||||
*/
|
||||
|
||||
ATH_TX_LOCK(sc);
|
||||
ATH_TX_IC_LOCK(sc);
|
||||
|
||||
/*
|
||||
* Throw the single frame onto the queue.
|
||||
@ -2797,7 +2797,7 @@ ath_txq_qadd(struct ifnet *ifp, struct mbuf *m0)
|
||||
|
||||
m = m->m_nextpkt;
|
||||
}
|
||||
ATH_TX_UNLOCK(sc);
|
||||
ATH_TX_IC_UNLOCK(sc);
|
||||
|
||||
return (0);
|
||||
bad:
|
||||
@ -2825,13 +2825,13 @@ ath_txq_qflush(struct ifnet *ifp)
|
||||
TAILQ_INIT(&txlist);
|
||||
|
||||
/* Grab lock */
|
||||
ATH_TX_LOCK(sc);
|
||||
ATH_TX_IC_LOCK(sc);
|
||||
|
||||
/* Copy everything out of sc_txbuf_list into txlist */
|
||||
TAILQ_CONCAT(&txlist, &sc->sc_txbuf_list, bf_list);
|
||||
|
||||
/* Unlock */
|
||||
ATH_TX_UNLOCK(sc);
|
||||
ATH_TX_IC_UNLOCK(sc);
|
||||
|
||||
/* Now, walk the list, freeing things */
|
||||
while ((bf = TAILQ_FIRST(&txlist)) != NULL) {
|
||||
@ -2879,16 +2879,9 @@ ath_txq_qrun(struct ifnet *ifp)
|
||||
*/
|
||||
|
||||
/* Copy everything out of sc_txbuf_list into txlist */
|
||||
ATH_TX_LOCK(sc);
|
||||
ATH_TX_IC_LOCK(sc);
|
||||
TAILQ_CONCAT(&txlist, &sc->sc_txbuf_list, bf_list);
|
||||
ATH_TX_UNLOCK(sc);
|
||||
|
||||
/*
|
||||
* For now, the ath_tx_start() code sits behind the same lock;
|
||||
* worry about serialising this in a taskqueue later.
|
||||
*/
|
||||
|
||||
ATH_TX_LOCK(sc);
|
||||
ATH_TX_IC_UNLOCK(sc);
|
||||
|
||||
/*
|
||||
* Attempt to transmit each frame.
|
||||
@ -2899,6 +2892,7 @@ ath_txq_qrun(struct ifnet *ifp)
|
||||
* It would be nice to chain together TX fragments in this
|
||||
* way so they can be aborted together.
|
||||
*/
|
||||
ATH_TX_LOCK(sc);
|
||||
TAILQ_FOREACH_SAFE(bf, &txlist, bf_list, bf_next) {
|
||||
/*
|
||||
* Clear, because we're going to reuse this
|
||||
@ -4230,9 +4224,9 @@ ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq, int dosched)
|
||||
ieee80211_ff_flush(ic, txq->axq_ac);
|
||||
#endif
|
||||
|
||||
/* Kick the TXQ scheduler */
|
||||
/* Kick the software TXQ scheduler */
|
||||
if (dosched) {
|
||||
taskqueue_enqueue(sc->sc_tx_tq, &sc->sc_txqtask);
|
||||
ath_tx_swq_kick(sc);
|
||||
}
|
||||
|
||||
ATH_KTR(sc, ATH_KTR_TXCOMP, 1,
|
||||
|
@ -195,6 +195,7 @@ ath_ahb_attach(device_t dev)
|
||||
ATH_PCU_LOCK_INIT(sc);
|
||||
ATH_RX_LOCK_INIT(sc);
|
||||
ATH_TX_LOCK_INIT(sc);
|
||||
ATH_TX_IC_LOCK_INIT(sc);
|
||||
ATH_TXSTATUS_LOCK_INIT(sc);
|
||||
|
||||
error = ath_attach(AR9130_DEVID, sc);
|
||||
@ -204,6 +205,7 @@ ath_ahb_attach(device_t dev)
|
||||
ATH_TXSTATUS_LOCK_DESTROY(sc);
|
||||
ATH_RX_LOCK_DESTROY(sc);
|
||||
ATH_TX_LOCK_DESTROY(sc);
|
||||
ATH_TX_IC_LOCK_DESTROY(sc);
|
||||
ATH_PCU_LOCK_DESTROY(sc);
|
||||
ATH_LOCK_DESTROY(sc);
|
||||
bus_dma_tag_destroy(sc->sc_dmat);
|
||||
@ -247,6 +249,7 @@ ath_ahb_detach(device_t dev)
|
||||
ATH_TXSTATUS_LOCK_DESTROY(sc);
|
||||
ATH_RX_LOCK_DESTROY(sc);
|
||||
ATH_TX_LOCK_DESTROY(sc);
|
||||
ATH_TX_IC_LOCK_DESTROY(sc);
|
||||
ATH_PCU_LOCK_DESTROY(sc);
|
||||
ATH_LOCK_DESTROY(sc);
|
||||
|
||||
|
@ -120,12 +120,24 @@ extern void ath_tx_update_tim(struct ath_softc *sc,
|
||||
extern void ath_start(struct ifnet *ifp);
|
||||
extern void ath_start_task(void *arg, int npending);
|
||||
|
||||
/*
|
||||
* Kick the frame TX task.
|
||||
*/
|
||||
static inline void
|
||||
ath_tx_kick(struct ath_softc *sc)
|
||||
{
|
||||
|
||||
/* XXX eventually try sc_tx_tq? */
|
||||
taskqueue_enqueue(sc->sc_tx_tq, &sc->sc_txpkttask);
|
||||
}
|
||||
|
||||
/*
|
||||
* Kick the software TX queue task.
|
||||
*/
|
||||
static inline void
|
||||
ath_tx_swq_kick(struct ath_softc *sc)
|
||||
{
|
||||
|
||||
taskqueue_enqueue(sc->sc_tx_tq, &sc->sc_txqtask);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -251,6 +251,7 @@ ath_pci_attach(device_t dev)
|
||||
ATH_PCU_LOCK_INIT(sc);
|
||||
ATH_RX_LOCK_INIT(sc);
|
||||
ATH_TX_LOCK_INIT(sc);
|
||||
ATH_TX_IC_LOCK_INIT(sc);
|
||||
ATH_TXSTATUS_LOCK_INIT(sc);
|
||||
|
||||
error = ath_attach(pci_get_device(dev), sc);
|
||||
@ -260,6 +261,7 @@ ath_pci_attach(device_t dev)
|
||||
ATH_TXSTATUS_LOCK_DESTROY(sc);
|
||||
ATH_PCU_LOCK_DESTROY(sc);
|
||||
ATH_RX_LOCK_DESTROY(sc);
|
||||
ATH_TX_IC_LOCK_DESTROY(sc);
|
||||
ATH_TX_LOCK_DESTROY(sc);
|
||||
ATH_LOCK_DESTROY(sc);
|
||||
bus_dma_tag_destroy(sc->sc_dmat);
|
||||
@ -302,6 +304,7 @@ ath_pci_detach(device_t dev)
|
||||
ATH_TXSTATUS_LOCK_DESTROY(sc);
|
||||
ATH_PCU_LOCK_DESTROY(sc);
|
||||
ATH_RX_LOCK_DESTROY(sc);
|
||||
ATH_TX_IC_LOCK_DESTROY(sc);
|
||||
ATH_TX_LOCK_DESTROY(sc);
|
||||
ATH_LOCK_DESTROY(sc);
|
||||
|
||||
|
@ -2999,9 +2999,11 @@ ath_tx_tid_resume(struct ath_softc *sc, struct ath_tid *tid)
|
||||
}
|
||||
|
||||
ath_tx_tid_sched(sc, tid);
|
||||
/* Punt some frames to the hardware if needed */
|
||||
//ath_txq_sched(sc, sc->sc_ac2q[tid->ac]);
|
||||
taskqueue_enqueue(sc->sc_tx_tq, &sc->sc_txqtask);
|
||||
|
||||
/*
|
||||
* Queue the software TX scheduler.
|
||||
*/
|
||||
ath_tx_swq_kick(sc);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -655,7 +655,7 @@ ath_edma_tx_processq(struct ath_softc *sc, int dosched)
|
||||
* the txq task for _one_ TXQ. This should be fixed.
|
||||
*/
|
||||
if (dosched)
|
||||
taskqueue_enqueue(sc->sc_tx_tq, &sc->sc_txqtask);
|
||||
ath_tx_swq_kick(sc);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -520,8 +520,10 @@ struct ath_softc {
|
||||
char sc_pcu_mtx_name[32];
|
||||
struct mtx sc_rx_mtx; /* RX access mutex */
|
||||
char sc_rx_mtx_name[32];
|
||||
struct mtx sc_tx_mtx; /* TX access mutex */
|
||||
struct mtx sc_tx_mtx; /* TX handling/comp mutex */
|
||||
char sc_tx_mtx_name[32];
|
||||
struct mtx sc_tx_ic_mtx; /* TX queue mutex */
|
||||
char sc_tx_ic_mtx_name[32];
|
||||
struct taskqueue *sc_tq; /* private task queue */
|
||||
struct taskqueue *sc_tx_tq; /* private TX task queue */
|
||||
struct ath_hal *sc_ah; /* Atheros HAL */
|
||||
@ -795,10 +797,8 @@ struct ath_softc {
|
||||
#define ATH_UNLOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_NOTOWNED)
|
||||
|
||||
/*
|
||||
* The TX lock is non-reentrant and serialises the TX send operations.
|
||||
* (ath_start(), ath_raw_xmit().) It doesn't yet serialise the TX
|
||||
* completion operations; thus it can't be used (yet!) to protect
|
||||
* hardware / software TXQ operations.
|
||||
* The TX lock is non-reentrant and serialises the TX frame send
|
||||
* and completion operations.
|
||||
*/
|
||||
#define ATH_TX_LOCK_INIT(_sc) do {\
|
||||
snprintf((_sc)->sc_tx_mtx_name, \
|
||||
@ -816,6 +816,26 @@ struct ath_softc {
|
||||
#define ATH_TX_UNLOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_tx_mtx, \
|
||||
MA_NOTOWNED)
|
||||
|
||||
/*
|
||||
* The IC TX lock is non-reentrant and serialises packet queuing from
|
||||
* the upper layers.
|
||||
*/
|
||||
#define ATH_TX_IC_LOCK_INIT(_sc) do {\
|
||||
snprintf((_sc)->sc_tx_ic_mtx_name, \
|
||||
sizeof((_sc)->sc_tx_ic_mtx_name), \
|
||||
"%s IC TX lock", \
|
||||
device_get_nameunit((_sc)->sc_dev)); \
|
||||
mtx_init(&(_sc)->sc_tx_ic_mtx, (_sc)->sc_tx_ic_mtx_name, \
|
||||
NULL, MTX_DEF); \
|
||||
} while (0)
|
||||
#define ATH_TX_IC_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_tx_ic_mtx)
|
||||
#define ATH_TX_IC_LOCK(_sc) mtx_lock(&(_sc)->sc_tx_ic_mtx)
|
||||
#define ATH_TX_IC_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_tx_ic_mtx)
|
||||
#define ATH_TX_IC_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_tx_ic_mtx, \
|
||||
MA_OWNED)
|
||||
#define ATH_TX_IC_UNLOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_tx_ic_mtx, \
|
||||
MA_NOTOWNED)
|
||||
|
||||
/*
|
||||
* The PCU lock is non-recursive and should be treated as a spinlock.
|
||||
* Although currently the interrupt code is run in netisr context and
|
||||
|
@ -893,14 +893,8 @@ mixer_hwvol_init(device_t dev)
|
||||
}
|
||||
|
||||
void
|
||||
mixer_hwvol_mute(device_t dev)
|
||||
mixer_hwvol_mute_locked(struct snd_mixer *m)
|
||||
{
|
||||
struct snd_mixer *m;
|
||||
struct cdev *pdev;
|
||||
|
||||
pdev = mixer_get_devt(dev);
|
||||
m = pdev->si_drv1;
|
||||
snd_mtxlock(m->lock);
|
||||
if (m->hwvol_muted) {
|
||||
m->hwvol_muted = 0;
|
||||
mixer_set(m, m->hwvol_mixer, m->hwvol_mute_level);
|
||||
@ -909,19 +903,26 @@ mixer_hwvol_mute(device_t dev)
|
||||
m->hwvol_mute_level = mixer_get(m, m->hwvol_mixer);
|
||||
mixer_set(m, m->hwvol_mixer, 0);
|
||||
}
|
||||
snd_mtxunlock(m->lock);
|
||||
}
|
||||
|
||||
void
|
||||
mixer_hwvol_step(device_t dev, int left_step, int right_step)
|
||||
mixer_hwvol_mute(device_t dev)
|
||||
{
|
||||
struct snd_mixer *m;
|
||||
int level, left, right;
|
||||
struct cdev *pdev;
|
||||
|
||||
pdev = mixer_get_devt(dev);
|
||||
m = pdev->si_drv1;
|
||||
snd_mtxlock(m->lock);
|
||||
mixer_hwvol_mute_locked(m);
|
||||
snd_mtxunlock(m->lock);
|
||||
}
|
||||
|
||||
void
|
||||
mixer_hwvol_step_locked(struct snd_mixer *m, int left_step, int right_step)
|
||||
{
|
||||
int level, left, right;
|
||||
|
||||
if (m->hwvol_muted) {
|
||||
m->hwvol_muted = 0;
|
||||
level = m->hwvol_mute_level;
|
||||
@ -929,15 +930,31 @@ mixer_hwvol_step(device_t dev, int left_step, int right_step)
|
||||
level = mixer_get(m, m->hwvol_mixer);
|
||||
if (level != -1) {
|
||||
left = level & 0xff;
|
||||
right = level >> 8;
|
||||
right = (level >> 8) & 0xff;
|
||||
left += left_step * m->hwvol_step;
|
||||
if (left < 0)
|
||||
left = 0;
|
||||
else if (left > 100)
|
||||
left = 100;
|
||||
right += right_step * m->hwvol_step;
|
||||
if (right < 0)
|
||||
right = 0;
|
||||
else if (right > 100)
|
||||
right = 100;
|
||||
mixer_set(m, m->hwvol_mixer, left | right << 8);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
mixer_hwvol_step(device_t dev, int left_step, int right_step)
|
||||
{
|
||||
struct snd_mixer *m;
|
||||
struct cdev *pdev;
|
||||
|
||||
pdev = mixer_get_devt(dev);
|
||||
m = pdev->si_drv1;
|
||||
snd_mtxlock(m->lock);
|
||||
mixer_hwvol_step_locked(m, left_step, right_step);
|
||||
snd_mtxunlock(m->lock);
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,9 @@ int mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode, struc
|
||||
int mixer_oss_mixerinfo(struct cdev *i_dev, oss_mixerinfo *mi);
|
||||
|
||||
int mixer_hwvol_init(device_t dev);
|
||||
void mixer_hwvol_mute_locked(struct snd_mixer *m);
|
||||
void mixer_hwvol_mute(device_t dev);
|
||||
void mixer_hwvol_step_locked(struct snd_mixer *m, int l_step, int r_step);
|
||||
void mixer_hwvol_step(device_t dev, int left_step, int right_step);
|
||||
|
||||
int mixer_busy(struct snd_mixer *m);
|
||||
|
@ -287,14 +287,17 @@ struct uaudio_hid {
|
||||
struct usb_xfer *xfer[UAUDIO_HID_N_TRANSFER];
|
||||
struct hid_location volume_up_loc;
|
||||
struct hid_location volume_down_loc;
|
||||
struct hid_location mute_loc;
|
||||
uint32_t flags;
|
||||
#define UAUDIO_HID_VALID 0x0001
|
||||
#define UAUDIO_HID_HAS_ID 0x0002
|
||||
#define UAUDIO_HID_HAS_VOLUME_UP 0x0004
|
||||
#define UAUDIO_HID_HAS_VOLUME_DOWN 0x0008
|
||||
#define UAUDIO_HID_HAS_MUTE 0x0010
|
||||
uint8_t iface_index;
|
||||
uint8_t volume_up_id;
|
||||
uint8_t volume_down_id;
|
||||
uint8_t mute_id;
|
||||
};
|
||||
|
||||
struct uaudio_softc {
|
||||
@ -1012,6 +1015,8 @@ uaudio_attach_sub(device_t dev, kobj_class_t mixer_class, kobj_class_t chan_clas
|
||||
goto detach;
|
||||
sc->sc_mixer_init = 1;
|
||||
|
||||
mixer_hwvol_init(dev);
|
||||
|
||||
snprintf(status, sizeof(status), "at ? %s", PCM_KLDSTRING(snd_uaudio));
|
||||
|
||||
if (pcm_register(dev, sc,
|
||||
@ -5520,9 +5525,6 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
struct uaudio_softc *sc = usbd_xfer_softc(xfer);
|
||||
const uint8_t *buffer = usbd_xfer_get_frame_buffer(xfer, 0);
|
||||
struct snd_mixer *m;
|
||||
int v;
|
||||
int v_l;
|
||||
int v_r;
|
||||
uint8_t id;
|
||||
int actlen;
|
||||
|
||||
@ -5543,6 +5545,16 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
|
||||
m = sc->sc_mixer_dev;
|
||||
|
||||
if ((sc->sc_hid.flags & UAUDIO_HID_HAS_MUTE) &&
|
||||
(sc->sc_hid.mute_id == id) &&
|
||||
hid_get_data(buffer, actlen,
|
||||
&sc->sc_hid.mute_loc)) {
|
||||
|
||||
DPRINTF("Mute toggle\n");
|
||||
|
||||
mixer_hwvol_mute_locked(m);
|
||||
}
|
||||
|
||||
if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_UP) &&
|
||||
(sc->sc_hid.volume_up_id == id) &&
|
||||
hid_get_data(buffer, actlen,
|
||||
@ -5550,13 +5562,7 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
|
||||
DPRINTF("Volume Up\n");
|
||||
|
||||
v = mix_get_locked(m, SOUND_MIXER_PCM, &v_l, &v_r);
|
||||
if (v == 0) {
|
||||
v = ((v_l + v_r) / 2) + 5;
|
||||
if (v > 100)
|
||||
v = 100;
|
||||
mix_set_locked(m, SOUND_MIXER_PCM, v, v);
|
||||
}
|
||||
mixer_hwvol_step_locked(m, 1, 1);
|
||||
}
|
||||
|
||||
if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_DOWN) &&
|
||||
@ -5566,13 +5572,7 @@ uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
|
||||
DPRINTF("Volume Down\n");
|
||||
|
||||
v = mix_get_locked(m, SOUND_MIXER_PCM, &v_l, &v_r);
|
||||
if (v == 0) {
|
||||
v = ((v_l + v_r) / 2) - 5;
|
||||
if (v < 0)
|
||||
v = 0;
|
||||
mix_set_locked(m, SOUND_MIXER_PCM, v, v);
|
||||
}
|
||||
mixer_hwvol_step_locked(m, -1, -1);
|
||||
}
|
||||
|
||||
case USB_ST_SETUP:
|
||||
@ -5641,10 +5641,20 @@ uaudio_hid_probe(struct uaudio_softc *sc,
|
||||
DPRINTFN(1, "Found Volume Down key\n");
|
||||
}
|
||||
|
||||
if (hid_locate(d_ptr, d_len,
|
||||
HID_USAGE2(HUP_CONSUMER, 0xE2 /* Mute */),
|
||||
hid_input, 0, &sc->sc_hid.mute_loc, &flags,
|
||||
&sc->sc_hid.mute_id)) {
|
||||
if (flags & HIO_VARIABLE)
|
||||
sc->sc_hid.flags |= UAUDIO_HID_HAS_MUTE;
|
||||
DPRINTFN(1, "Found Mute key\n");
|
||||
}
|
||||
|
||||
free(d_ptr, M_TEMP);
|
||||
|
||||
if (!(sc->sc_hid.flags & (UAUDIO_HID_HAS_VOLUME_UP |
|
||||
UAUDIO_HID_HAS_VOLUME_DOWN))) {
|
||||
UAUDIO_HID_HAS_VOLUME_DOWN |
|
||||
UAUDIO_HID_HAS_MUTE))) {
|
||||
DPRINTFN(1, "Did not find any volume related keys\n");
|
||||
return (-1);
|
||||
}
|
||||
|
@ -336,7 +336,7 @@ intr_event_bind(struct intr_event *ie, u_char cpu)
|
||||
if (ie->ie_cpu == NOCPU)
|
||||
CPU_COPY(cpuset_root, &mask);
|
||||
else
|
||||
CPU_SET(cpu, &mask);
|
||||
CPU_SET(ie->ie_cpu, &mask);
|
||||
id = ie->ie_thread->it_thread->td_tid;
|
||||
mtx_unlock(&ie->ie_lock);
|
||||
(void)cpuset_setthread(id, &mask);
|
||||
|
@ -238,6 +238,7 @@ kern_bind(td, fd, sa)
|
||||
int error;
|
||||
|
||||
AUDIT_ARG_FD(fd);
|
||||
AUDIT_ARG_SOCKADDR(td, sa);
|
||||
error = getsock_cap(td->td_proc->p_fd, fd, CAP_BIND, &fp, NULL);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -452,6 +453,7 @@ kern_accept(struct thread *td, int s, struct sockaddr **name,
|
||||
*namelen = 0;
|
||||
goto done;
|
||||
}
|
||||
AUDIT_ARG_SOCKADDR(td, sa);
|
||||
if (name) {
|
||||
/* check sa_len before it is destroyed */
|
||||
if (*namelen > sa->sa_len)
|
||||
@ -547,6 +549,7 @@ kern_connect(td, fd, sa)
|
||||
int interrupted = 0;
|
||||
|
||||
AUDIT_ARG_FD(fd);
|
||||
AUDIT_ARG_SOCKADDR(td, sa);
|
||||
error = getsock_cap(td->td_proc->p_fd, fd, CAP_CONNECT, &fp, NULL);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -763,8 +766,10 @@ kern_sendit(td, s, mp, flags, control, segflg)
|
||||
|
||||
AUDIT_ARG_FD(s);
|
||||
rights = CAP_WRITE;
|
||||
if (mp->msg_name != NULL)
|
||||
if (mp->msg_name != NULL) {
|
||||
AUDIT_ARG_SOCKADDR(td, mp->msg_name);
|
||||
rights |= CAP_CONNECT;
|
||||
}
|
||||
error = getsock_cap(td->td_proc->p_fd, s, rights, &fp, NULL);
|
||||
if (error)
|
||||
return (error);
|
||||
@ -956,11 +961,11 @@ kern_recvit(td, s, mp, fromseg, controlp)
|
||||
int i;
|
||||
ssize_t len;
|
||||
int error;
|
||||
struct mbuf *m, *control = 0;
|
||||
struct mbuf *m, *control = NULL;
|
||||
caddr_t ctlbuf;
|
||||
struct file *fp;
|
||||
struct socket *so;
|
||||
struct sockaddr *fromsa = 0;
|
||||
struct sockaddr *fromsa = NULL;
|
||||
#ifdef KTRACE
|
||||
struct uio *ktruio = NULL;
|
||||
#endif
|
||||
@ -1001,14 +1006,16 @@ kern_recvit(td, s, mp, fromseg, controlp)
|
||||
ktruio = cloneuio(&auio);
|
||||
#endif
|
||||
len = auio.uio_resid;
|
||||
error = soreceive(so, &fromsa, &auio, (struct mbuf **)0,
|
||||
(mp->msg_control || controlp) ? &control : (struct mbuf **)0,
|
||||
error = soreceive(so, &fromsa, &auio, NULL,
|
||||
(mp->msg_control || controlp) ? &control : NULL,
|
||||
&mp->msg_flags);
|
||||
if (error) {
|
||||
if (auio.uio_resid != len && (error == ERESTART ||
|
||||
error == EINTR || error == EWOULDBLOCK))
|
||||
error = 0;
|
||||
}
|
||||
if (fromsa != NULL)
|
||||
AUDIT_ARG_SOCKADDR(td, fromsa);
|
||||
#ifdef KTRACE
|
||||
if (ktruio != NULL) {
|
||||
ktruio->uio_resid = len - auio.uio_resid;
|
||||
@ -1020,7 +1027,7 @@ kern_recvit(td, s, mp, fromseg, controlp)
|
||||
td->td_retval[0] = len - auio.uio_resid;
|
||||
if (mp->msg_name) {
|
||||
len = mp->msg_namelen;
|
||||
if (len <= 0 || fromsa == 0)
|
||||
if (len <= 0 || fromsa == NULL)
|
||||
len = 0;
|
||||
else {
|
||||
/* save sa_len before it is destroyed by MSG_COMPAT */
|
||||
@ -1095,7 +1102,7 @@ kern_recvit(td, s, mp, fromseg, controlp)
|
||||
if (fromsa)
|
||||
free(fromsa, M_SONAME);
|
||||
|
||||
if (error == 0 && controlp != NULL)
|
||||
if (error == 0 && controlp != NULL)
|
||||
*controlp = control;
|
||||
else if (control)
|
||||
m_freem(control);
|
||||
@ -1716,7 +1723,7 @@ getsockaddr(namp, uaddr, len)
|
||||
struct sendfile_sync {
|
||||
struct mtx mtx;
|
||||
struct cv cv;
|
||||
unsigned count;
|
||||
unsigned count;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -2233,7 +2240,7 @@ kern_sendfile(struct thread *td, struct sendfile_args *uap,
|
||||
}
|
||||
|
||||
/* Quit outer loop on error or when we're done. */
|
||||
if (done)
|
||||
if (done)
|
||||
break;
|
||||
if (error)
|
||||
goto done;
|
||||
@ -2333,7 +2340,7 @@ sys_sctp_peeloff(td, uap)
|
||||
|
||||
CURVNET_SET(head->so_vnet);
|
||||
so = sonewconn(head, SS_ISCONNECTED);
|
||||
if (so == NULL)
|
||||
if (so == NULL)
|
||||
goto noconnection;
|
||||
/*
|
||||
* Before changing the flags on the socket, we have to bump the
|
||||
@ -2387,12 +2394,12 @@ int
|
||||
sys_sctp_generic_sendmsg (td, uap)
|
||||
struct thread *td;
|
||||
struct sctp_generic_sendmsg_args /* {
|
||||
int sd,
|
||||
caddr_t msg,
|
||||
int mlen,
|
||||
caddr_t to,
|
||||
__socklen_t tolen,
|
||||
struct sctp_sndrcvinfo *sinfo,
|
||||
int sd,
|
||||
caddr_t msg,
|
||||
int mlen,
|
||||
caddr_t to,
|
||||
__socklen_t tolen,
|
||||
struct sctp_sndrcvinfo *sinfo,
|
||||
int flags
|
||||
} */ *uap;
|
||||
{
|
||||
@ -2498,12 +2505,12 @@ int
|
||||
sys_sctp_generic_sendmsg_iov(td, uap)
|
||||
struct thread *td;
|
||||
struct sctp_generic_sendmsg_iov_args /* {
|
||||
int sd,
|
||||
struct iovec *iov,
|
||||
int iovlen,
|
||||
caddr_t to,
|
||||
__socklen_t tolen,
|
||||
struct sctp_sndrcvinfo *sinfo,
|
||||
int sd,
|
||||
struct iovec *iov,
|
||||
int iovlen,
|
||||
caddr_t to,
|
||||
__socklen_t tolen,
|
||||
struct sctp_sndrcvinfo *sinfo,
|
||||
int flags
|
||||
} */ *uap;
|
||||
{
|
||||
@ -2625,12 +2632,12 @@ int
|
||||
sys_sctp_generic_recvmsg(td, uap)
|
||||
struct thread *td;
|
||||
struct sctp_generic_recvmsg_args /* {
|
||||
int sd,
|
||||
struct iovec *iov,
|
||||
int sd,
|
||||
struct iovec *iov,
|
||||
int iovlen,
|
||||
struct sockaddr *from,
|
||||
struct sockaddr *from,
|
||||
__socklen_t *fromlenaddr,
|
||||
struct sctp_sndrcvinfo *sinfo,
|
||||
struct sctp_sndrcvinfo *sinfo,
|
||||
int *msg_flags
|
||||
} */ *uap;
|
||||
{
|
||||
@ -2696,7 +2703,7 @@ sys_sctp_generic_recvmsg(td, uap)
|
||||
}
|
||||
auio.uio_iov = iov;
|
||||
auio.uio_iovcnt = uap->iovlen;
|
||||
auio.uio_segflg = UIO_USERSPACE;
|
||||
auio.uio_segflg = UIO_USERSPACE;
|
||||
auio.uio_rw = UIO_READ;
|
||||
auio.uio_td = td;
|
||||
auio.uio_offset = 0; /* XXX */
|
||||
@ -2767,7 +2774,7 @@ sys_sctp_generic_recvmsg(td, uap)
|
||||
out:
|
||||
free(iov, M_IOV);
|
||||
out1:
|
||||
if (fp)
|
||||
if (fp)
|
||||
fdrop(fp, td);
|
||||
|
||||
return (error);
|
||||
|
@ -261,6 +261,11 @@ void audit_thread_free(struct thread *td);
|
||||
audit_arg_socket((sodomain), (sotype), (soprotocol)); \
|
||||
} while (0)
|
||||
|
||||
#define AUDIT_ARG_SOCKADDR(td, sa) do { \
|
||||
if (AUDITING_TD(curthread)) \
|
||||
audit_arg_sockaddr((td), (sa)); \
|
||||
} while (0)
|
||||
|
||||
#define AUDIT_ARG_SUID(suid) do { \
|
||||
if (AUDITING_TD(curthread)) \
|
||||
audit_arg_suid((suid)); \
|
||||
@ -353,6 +358,7 @@ void audit_thread_free(struct thread *td);
|
||||
#define AUDIT_ARG_SIGNUM(signum)
|
||||
#define AUDIT_ARG_SGID(sgid)
|
||||
#define AUDIT_ARG_SOCKET(sodomain, sotype, soprotocol)
|
||||
#define AUDIT_ARG_SOCKADDR(td, sa)
|
||||
#define AUDIT_ARG_SUID(suid)
|
||||
#define AUDIT_ARG_TEXT(text)
|
||||
#define AUDIT_ARG_UID(uid)
|
||||
|
Loading…
Reference in New Issue
Block a user