Give (*ext_free) an int return value allowing for very sophisticated

external mbuf buffer management capabilities in the future.

For now only EXT_FREE_OK is defined with current legacy behavior.

Sponsored by:	The FreeBSD Foundation
This commit is contained in:
andre 2013-08-25 10:57:09 +00:00
parent 8e41c705d0
commit 6c0efad132
16 changed files with 53 additions and 39 deletions

View File

@ -482,16 +482,14 @@ ndis_return(dobj, arg)
KeReleaseSpinLock(&block->nmb_returnlock, irql);
}
void
ndis_return_packet(buf, arg)
void *buf; /* not used */
void *arg;
int
ndis_return_packet(struct mbuf *m, void *buf, void *arg)
{
ndis_packet *p;
ndis_miniport_block *block;
if (arg == NULL)
return;
return (EXT_FREE_OK);
p = arg;
@ -500,7 +498,7 @@ ndis_return_packet(buf, arg)
/* Release packet when refcount hits zero, otherwise return. */
if (p->np_refcnt)
return;
return (EXT_FREE_OK);
block = ((struct ndis_softc *)p->np_softc)->ndis_block;
@ -512,6 +510,8 @@ ndis_return_packet(buf, arg)
IoQueueWorkItem(block->nmb_returnitem,
(io_workitem_func)kernndis_functbl[7].ipt_wrap,
WORKQUEUE_CRITICAL, block);
return (EXT_FREE_OK);
}
void

View File

@ -1743,7 +1743,7 @@ extern int ndis_halt_nic(void *);
extern int ndis_shutdown_nic(void *);
extern int ndis_pnpevent_nic(void *, int);
extern int ndis_init_nic(void *);
extern void ndis_return_packet(void *, void *);
extern int ndis_return_packet(struct mbuf *, void *, void *);
extern int ndis_init_dma(void *);
extern int ndis_destroy_dma(void *);
extern int ndis_create_sysctls(void *);

View File

@ -132,7 +132,7 @@ static void cas_detach(struct cas_softc *sc);
static int cas_disable_rx(struct cas_softc *sc);
static int cas_disable_tx(struct cas_softc *sc);
static void cas_eint(struct cas_softc *sc, u_int status);
static void cas_free(struct mbuf *m, void *arg1, void* arg2);
static int cas_free(struct mbuf *m, void *arg1, void* arg2);
static void cas_init(void *xsc);
static void cas_init_locked(struct cas_softc *sc);
static void cas_init_regs(struct cas_softc *sc);
@ -1887,7 +1887,7 @@ cas_rint(struct cas_softc *sc)
#endif
}
static void
static int
cas_free(struct mbuf *m, void *arg1, void *arg2)
{
struct cas_rxdsoft *rxds;
@ -1904,7 +1904,7 @@ cas_free(struct mbuf *m, void *arg1, void *arg2)
rxds = &sc->sc_rxdsoft[idx];
#endif
if (refcount_release(&rxds->rxds_refcount) == 0)
return;
return (EXT_FREE_OK);
/*
* NB: this function can be called via m_freem(9) within
@ -1915,6 +1915,7 @@ cas_free(struct mbuf *m, void *arg1, void *arg2)
cas_add_rxdesc(sc, idx);
if (locked == 0)
CAS_UNLOCK(sc);
return (EXT_FREE_OK);
}
static inline void

View File

@ -260,7 +260,7 @@ hatm_mbuf_page_alloc(struct hatm_softc *sc, u_int group)
/*
* Free an mbuf and put it onto the free list.
*/
static void
static int
hatm_mbuf0_free(struct mbuf *m, void *buf, void *args)
{
struct hatm_softc *sc = args;
@ -270,8 +270,9 @@ hatm_mbuf0_free(struct mbuf *m, void *buf, void *args)
("freeing unused mbuf %x", c->hdr.flags));
c->hdr.flags &= ~MBUF_USED;
hatm_ext_free(&sc->mbuf_list[0], (struct mbufx_free *)c);
return (EXT_FREE_OK);
}
static void
static int
hatm_mbuf1_free(struct mbuf *m, void *buf, void *args)
{
struct hatm_softc *sc = args;
@ -281,6 +282,7 @@ hatm_mbuf1_free(struct mbuf *m, void *buf, void *args)
("freeing unused mbuf %x", c->hdr.flags));
c->hdr.flags &= ~MBUF_USED;
hatm_ext_free(&sc->mbuf_list[1], (struct mbufx_free *)c);
return (EXT_FREE_OK);
}
static void
@ -461,7 +463,7 @@ hatm_rx_buffer(struct hatm_softc *sc, u_int group, u_int handle)
hatm_mbuf0_free, c0, sc, M_PKTHDR, EXT_EXTREF);
m->m_data += MBUF0_OFFSET;
} else
hatm_mbuf0_free(NULL, c0, sc);
(void)hatm_mbuf0_free(NULL, c0, sc);
} else {
struct mbuf1_chunk *c1;
@ -485,7 +487,7 @@ hatm_rx_buffer(struct hatm_softc *sc, u_int group, u_int handle)
hatm_mbuf1_free, c1, sc, M_PKTHDR, EXT_EXTREF);
m->m_data += MBUF1_OFFSET;
} else
hatm_mbuf1_free(NULL, c1, sc);
(void)hatm_mbuf1_free(NULL, c1, sc);
}
return (m);

View File

@ -1401,7 +1401,7 @@ ndis_rxeof(adapter, packets, pktcnt)
p = packets[i];
if (p->np_oob.npo_status == NDIS_STATUS_SUCCESS) {
p->np_refcnt++;
ndis_return_packet(p, block);
(void)ndis_return_packet(NULL ,p, block);
}
}
return;
@ -1414,7 +1414,7 @@ ndis_rxeof(adapter, packets, pktcnt)
if (ndis_ptom(&m0, p)) {
device_printf(sc->ndis_dev, "ptom failed\n");
if (p->np_oob.npo_status == NDIS_STATUS_SUCCESS)
ndis_return_packet(p, block);
(void)ndis_return_packet(NULL, p, block);
} else {
#ifdef notdef
if (p->np_oob.npo_status == NDIS_STATUS_RESOURCES) {

View File

@ -68,7 +68,7 @@ static int ou_refcnt = 0;
/*
| function for freeing external storage for mbuf
*/
static void
static int
ext_free(struct mbuf *m, void *a, void *b)
{
pduq_t *pq = b;
@ -78,6 +78,7 @@ ext_free(struct mbuf *m, void *a, void *b)
free(pq->buf, M_ISCSIBUF);
pq->buf = NULL;
}
return (EXT_FREE_OK);
}
int

View File

@ -122,7 +122,7 @@ static int lge_detach(device_t);
static int lge_alloc_jumbo_mem(struct lge_softc *);
static void lge_free_jumbo_mem(struct lge_softc *);
static void *lge_jalloc(struct lge_softc *);
static void lge_jfree(struct mbuf *, void *, void *);
static int lge_jfree(struct mbuf *, void *, void *);
static int lge_newbuf(struct lge_softc *, struct lge_rx_desc *, struct mbuf *);
static int lge_encap(struct lge_softc *, struct mbuf *, u_int32_t *);
@ -846,7 +846,7 @@ lge_jalloc(sc)
/*
* Release a jumbo buffer.
*/
static void
static int
lge_jfree(struct mbuf *m, void *buf, void *args)
{
struct lge_softc *sc;
@ -873,7 +873,7 @@ lge_jfree(struct mbuf *m, void *buf, void *args)
SLIST_REMOVE_HEAD(&sc->lge_jinuse_listhead, jpool_entries);
SLIST_INSERT_HEAD(&sc->lge_jfree_listhead, entry, jpool_entries);
return;
return (EXT_FREE_OK);
}
/*

View File

@ -2621,7 +2621,7 @@ mwl_rxbuf_init(struct mwl_softc *sc, struct mwl_rxbuf *bf)
return 0;
}
static void
static int
mwl_ext_free(struct mbuf *m, void *data, void *arg)
{
struct mwl_softc *sc = arg;
@ -2637,6 +2637,7 @@ mwl_ext_free(struct mbuf *m, void *data, void *arg)
sc->sc_rxblocked = 0;
mwl_hal_intrset(sc->sc_mh, sc->sc_imask);
}
return (EXT_FREE_OK);
}
struct mwl_frame_bar {

View File

@ -142,7 +142,7 @@ static int wb_probe(device_t);
static int wb_attach(device_t);
static int wb_detach(device_t);
static void wb_bfree(void *addr, void *args);
static int wb_bfree(struct mbuf *, void *addr, void *args);
static int wb_newbuf(struct wb_softc *, struct wb_chain_onefrag *,
struct mbuf *);
static int wb_encap(struct wb_softc *, struct wb_chain *, struct mbuf *);
@ -822,12 +822,11 @@ wb_list_rx_init(sc)
return(0);
}
static void
wb_bfree(buf, args)
void *buf;
void *args;
static int
wb_bfree(struct mbuf *m, void *buf, void *args)
{
return (EXT_FREE_OK);
}
/*

View File

@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
#include <machine/bus.h>
#include <sys/mbuf.h>
#include <sys/mbpool.h>
MODULE_VERSION(libmbpool, 1);
@ -282,10 +283,12 @@ mbp_free(struct mbpool *p, void *ptr)
/*
* Mbuf system external mbuf free routine
*/
void
int
mbp_ext_free(struct mbuf *m, void *buf, void *arg)
{
mbp_free(arg, buf);
return (EXT_FREE_OK);
}
/*

View File

@ -70,9 +70,9 @@ struct netsend_cow_stats {
static struct netsend_cow_stats socow_stats;
static void socow_iodone(struct mbuf *m, void *addr, void *args);
static int socow_iodone(struct mbuf *m, void *addr, void *args);
static void
static int
socow_iodone(struct mbuf *m, void *addr, void *args)
{
struct sf_buf *sf;
@ -94,6 +94,7 @@ socow_iodone(struct mbuf *m, void *addr, void *args)
vm_page_free(pp);
vm_page_unlock(pp);
socow_stats.iodone++;
return (EXT_FREE_OK);
}
int

View File

@ -247,7 +247,7 @@ m_freem(struct mbuf *mb)
*/
int
m_extadd(struct mbuf *mb, caddr_t buf, u_int size,
void (*freef)(struct mbuf *, void *, void *), void *arg1, void *arg2,
int (*freef)(struct mbuf *, void *, void *), void *arg1, void *arg2,
int flags, int type, int wait)
{
KASSERT(type != EXT_CLUSTER, ("%s: EXT_CLUSTER not allowed", __func__));
@ -321,7 +321,7 @@ mb_free_ext(struct mbuf *m)
case EXT_EXTREF:
KASSERT(m->m_ext.ext_free != NULL,
("%s: ext_free not set", __func__));
(*(m->m_ext.ext_free))(m, m->m_ext.ext_arg1,
(void)(*(m->m_ext.ext_free))(m, m->m_ext.ext_arg1,
m->m_ext.ext_arg2);
break;
default:

View File

@ -1854,7 +1854,7 @@ struct sendfile_sync {
/*
* Detach mapped page and release resources back to the system.
*/
void
int
sf_buf_mext(struct mbuf *mb, void *addr, void *args)
{
vm_page_t m;
@ -1873,13 +1873,14 @@ sf_buf_mext(struct mbuf *mb, void *addr, void *args)
vm_page_free(m);
vm_page_unlock(m);
if (addr == NULL)
return;
return (EXT_FREE_OK);
sfs = addr;
mtx_lock(&sfs->mtx);
KASSERT(sfs->count> 0, ("Sendfile sync botchup count == 0"));
if (--sfs->count == 0)
cv_signal(&sfs->cv);
mtx_unlock(&sfs->mtx);
return (EXT_FREE_OK);
}
/*
@ -2315,14 +2316,14 @@ retry_space:
m0 = m_get((mnw ? M_NOWAIT : M_WAITOK), MT_DATA);
if (m0 == NULL) {
error = (mnw ? EAGAIN : ENOBUFS);
sf_buf_mext(NULL, NULL, sf);
(void)sf_buf_mext(NULL, NULL, sf);
break;
}
if (m_extadd(m0, (caddr_t )sf_buf_kva(sf), PAGE_SIZE,
sf_buf_mext, sfs, sf, M_RDONLY, EXT_SFBUF,
(mnw ? M_NOWAIT : M_WAITOK)) != 0) {
error = (mnw ? EAGAIN : ENOBUFS);
sf_buf_mext(NULL, NULL, sf);
(void)sf_buf_mext(NULL, NULL, sf);
m_freem(m0);
break;
}

View File

@ -69,7 +69,7 @@ void *mbp_alloc(struct mbpool *, bus_addr_t *, uint32_t *);
void mbp_free(struct mbpool *, void *);
/* free a chunk that is an external mbuf */
void mbp_ext_free(struct mbuf *, void *, void *);
int mbp_ext_free(struct mbuf *, void *, void *);
/* free all buffers that are marked to be on the card */
void mbp_card_free(struct mbpool *);

View File

@ -165,7 +165,7 @@ struct m_ext {
uint32_t ext_size; /* size of buffer, for ext_free */
uint32_t ext_type:8, /* type of external storage */
ext_flags:24; /* external storage mbuf flags */
void (*ext_free) /* free routine if not the usual */
int (*ext_free) /* free routine if not the usual */
(struct mbuf *, void *, void *);
void *ext_arg1; /* optional argument pointer */
void *ext_arg2; /* optional argument pointer */
@ -365,6 +365,11 @@ struct mbuf {
"\24EXT_FLAG_VENDOR4\25EXT_FLAG_EXP1\26EXT_FLAG_EXP2\27EXT_FLAG_EXP3" \
"\30EXT_FLAG_EXP4"
/*
* Return values for (*ext_free).
*/
#define EXT_FREE_OK 0 /* Normal return */
/*
* Flags indicating checksum, segmentation and other offload work to be
* done, or already done, by hardware or lower layers. It is split into
@ -895,7 +900,7 @@ int m_apply(struct mbuf *, int, int,
int m_append(struct mbuf *, int, c_caddr_t);
void m_cat(struct mbuf *, struct mbuf *);
int m_extadd(struct mbuf *, caddr_t, u_int,
void (*)(struct mbuf *, void *, void *), void *, void *,
int (*)(struct mbuf *, void *, void *), void *, void *,
int, int, int);
struct mbuf *m_collapse(struct mbuf *, int, int);
void m_copyback(struct mbuf *, int, int, c_caddr_t);

View File

@ -67,6 +67,6 @@ extern counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
struct sf_buf *
sf_buf_alloc(struct vm_page *m, int flags);
void sf_buf_free(struct sf_buf *sf);
void sf_buf_mext(struct mbuf *mb, void *addr, void *args);
int sf_buf_mext(struct mbuf *mb, void *addr, void *args);
#endif /* !_SYS_SF_BUF_H_ */