Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/cxgbe/tom/t4_ddp.c
Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | |||||
free_pageset(struct tom_data *td, struct pageset *ps) | free_pageset(struct tom_data *td, struct pageset *ps) | ||||
{ | { | ||||
vm_page_t p; | vm_page_t p; | ||||
int i; | int i; | ||||
if (ps->prsv.prsv_nppods > 0) | if (ps->prsv.prsv_nppods > 0) | ||||
t4_free_page_pods(&ps->prsv); | t4_free_page_pods(&ps->prsv); | ||||
if (ps->flags & PS_WIRED) { | |||||
for (i = 0; i < ps->npages; i++) { | for (i = 0; i < ps->npages; i++) { | ||||
p = ps->pages[i]; | p = ps->pages[i]; | ||||
vm_page_lock(p); | vm_page_lock(p); | ||||
vm_page_unwire(p, PQ_INACTIVE); | vm_page_unwire(p, PQ_INACTIVE); | ||||
vm_page_unlock(p); | vm_page_unlock(p); | ||||
} | } | ||||
} else | |||||
vm_page_unhold_pages(ps->pages, ps->npages); | |||||
mtx_lock(&ddp_orphan_pagesets_lock); | mtx_lock(&ddp_orphan_pagesets_lock); | ||||
TAILQ_INSERT_TAIL(&ddp_orphan_pagesets, ps, link); | TAILQ_INSERT_TAIL(&ddp_orphan_pagesets, ps, link); | ||||
taskqueue_enqueue(taskqueue_thread, &ddp_orphan_task); | taskqueue_enqueue(taskqueue_thread, &ddp_orphan_task); | ||||
mtx_unlock(&ddp_orphan_pagesets_lock); | mtx_unlock(&ddp_orphan_pagesets_lock); | ||||
} | } | ||||
static void | static void | ||||
ddp_free_orphan_pagesets(void *context, int pending) | ddp_free_orphan_pagesets(void *context, int pending) | ||||
Show All 13 Lines | ddp_free_orphan_pagesets(void *context, int pending) | ||||
mtx_unlock(&ddp_orphan_pagesets_lock); | mtx_unlock(&ddp_orphan_pagesets_lock); | ||||
} | } | ||||
static void | static void | ||||
recycle_pageset(struct toepcb *toep, struct pageset *ps) | recycle_pageset(struct toepcb *toep, struct pageset *ps) | ||||
{ | { | ||||
DDP_ASSERT_LOCKED(toep); | DDP_ASSERT_LOCKED(toep); | ||||
if (!(toep->ddp.flags & DDP_DEAD) && ps->flags & PS_WIRED) { | if (!(toep->ddp.flags & DDP_DEAD)) { | ||||
KASSERT(toep->ddp.cached_count + toep->ddp.active_count < | KASSERT(toep->ddp.cached_count + toep->ddp.active_count < | ||||
nitems(toep->ddp.db), ("too many wired pagesets")); | nitems(toep->ddp.db), ("too many wired pagesets")); | ||||
TAILQ_INSERT_HEAD(&toep->ddp.cached_pagesets, ps, link); | TAILQ_INSERT_HEAD(&toep->ddp.cached_pagesets, ps, link); | ||||
toep->ddp.cached_count++; | toep->ddp.cached_count++; | ||||
} else | } else | ||||
free_pageset(toep->td, ps); | free_pageset(toep->td, ps); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,023 Lines • ▼ Show 20 Lines | #endif | ||||
t4_wrq_tx(sc, wr); | t4_wrq_tx(sc, wr); | ||||
} | } | ||||
MPASS(pva <= end_pva); | MPASS(pva <= end_pva); | ||||
return (0); | return (0); | ||||
} | } | ||||
static void | |||||
wire_pageset(struct pageset *ps) | |||||
{ | |||||
vm_page_t p; | |||||
int i; | |||||
KASSERT(!(ps->flags & PS_WIRED), ("pageset already wired")); | |||||
for (i = 0; i < ps->npages; i++) { | |||||
p = ps->pages[i]; | |||||
vm_page_lock(p); | |||||
vm_page_wire(p); | |||||
vm_page_unhold(p); | |||||
vm_page_unlock(p); | |||||
} | |||||
ps->flags |= PS_WIRED; | |||||
} | |||||
/* | /* | ||||
* Prepare a pageset for DDP. This wires the pageset and sets up page | * Prepare a pageset for DDP. This sets up page pods. | ||||
* pods. | |||||
*/ | */ | ||||
static int | static int | ||||
prep_pageset(struct adapter *sc, struct toepcb *toep, struct pageset *ps) | prep_pageset(struct adapter *sc, struct toepcb *toep, struct pageset *ps) | ||||
{ | { | ||||
struct tom_data *td = sc->tom_softc; | struct tom_data *td = sc->tom_softc; | ||||
if (!(ps->flags & PS_WIRED)) | |||||
wire_pageset(ps); | |||||
if (ps->prsv.prsv_nppods == 0 && | if (ps->prsv.prsv_nppods == 0 && | ||||
!t4_alloc_page_pods_for_ps(&td->pr, ps)) { | !t4_alloc_page_pods_for_ps(&td->pr, ps)) { | ||||
return (0); | return (0); | ||||
} | } | ||||
if (!(ps->flags & PS_PPODS_WRITTEN) && | if (!(ps->flags & PS_PPODS_WRITTEN) && | ||||
t4_write_page_pods_for_ps(sc, toep->ctrlq, toep->tid, ps) != 0) { | t4_write_page_pods_for_ps(sc, toep->ctrlq, toep->tid, ps) != 0) { | ||||
return (0); | return (0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 750 Lines • Show Last 20 Lines |