|
|
|
|
/* Copyright (C) 2007-2014 Open Information Security Foundation
|
|
|
|
|
*
|
|
|
|
|
* You can copy, redistribute or modify this Program under the terms of
|
|
|
|
|
* the GNU General Public License version 2 as published by the Free
|
|
|
|
|
* Software Foundation.
|
|
|
|
|
*
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
|
* version 2 along with this program; if not, write to the Free Software
|
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
|
|
|
* 02110-1301, USA.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \file
|
|
|
|
|
*
|
|
|
|
|
* \author Victor Julien <victor@inliniac.net>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef __TMQH_PACKETPOOL_H__
|
|
|
|
|
#define __TMQH_PACKETPOOL_H__
|
|
|
|
|
|
|
|
|
|
#include "decode.h"
|
For PktPool add local pending freed packets list.
Better handle the autofp case where one thread allocates the majority
of the packets and other threads free those packets.
Add a list of locally pending packets. The first packet freed goes on the
pending list, then subsequent freed packets for the same Packet Pool are
added to this list until it hits a fixed number of packets, then the
entire list of packets is pushed onto the pool's return stack. If a freed
packet is not for the pending pool, it is freed immediately to its pool's
return stack, as before.
For the autofp case, since there is only one Packet Pool doing all the
allocation, every other thread will keep a list of pending packets for
that pool.
For the worker run mode, most packets are allocated and freed locally. For
the case where packets are being returned to a remote pool, a pending list
will be kept for one of those other threads, all others are returned as before.
Which remote pool for which to keep a pending list is changed each time the
pending list is returned. Since the return pending pool is cleared when it is
freed, then next packet to be freed chooses the new pending pool.
12 years ago
|
|
|
#include "threads.h"
|
|
|
|
|
|
|
|
|
|
/* Return stack, onto which other threads free packets. */
|
|
|
|
|
typedef struct PktPoolLockedStack_{
|
|
|
|
|
/* linked list of free packets. */
|
|
|
|
|
SCMutex mutex;
|
For PktPool add local pending freed packets list.
Better handle the autofp case where one thread allocates the majority
of the packets and other threads free those packets.
Add a list of locally pending packets. The first packet freed goes on the
pending list, then subsequent freed packets for the same Packet Pool are
added to this list until it hits a fixed number of packets, then the
entire list of packets is pushed onto the pool's return stack. If a freed
packet is not for the pending pool, it is freed immediately to its pool's
return stack, as before.
For the autofp case, since there is only one Packet Pool doing all the
allocation, every other thread will keep a list of pending packets for
that pool.
For the worker run mode, most packets are allocated and freed locally. For
the case where packets are being returned to a remote pool, a pending list
will be kept for one of those other threads, all others are returned as before.
Which remote pool for which to keep a pending list is changed each time the
pending list is returned. Since the return pending pool is cleared when it is
freed, then next packet to be freed chooses the new pending pool.
12 years ago
|
|
|
Packet *head;
|
|
|
|
|
} __attribute__((aligned(CLS))) PktPoolLockedStack;
|
|
|
|
|
|
|
|
|
|
typedef struct PktPool_ {
|
For PktPool add local pending freed packets list.
Better handle the autofp case where one thread allocates the majority
of the packets and other threads free those packets.
Add a list of locally pending packets. The first packet freed goes on the
pending list, then subsequent freed packets for the same Packet Pool are
added to this list until it hits a fixed number of packets, then the
entire list of packets is pushed onto the pool's return stack. If a freed
packet is not for the pending pool, it is freed immediately to its pool's
return stack, as before.
For the autofp case, since there is only one Packet Pool doing all the
allocation, every other thread will keep a list of pending packets for
that pool.
For the worker run mode, most packets are allocated and freed locally. For
the case where packets are being returned to a remote pool, a pending list
will be kept for one of those other threads, all others are returned as before.
Which remote pool for which to keep a pending list is changed each time the
pending list is returned. Since the return pending pool is cleared when it is
freed, then next packet to be freed chooses the new pending pool.
12 years ago
|
|
|
/* link listed of free packets local to this thread.
|
|
|
|
|
* No mutex is needed.
|
|
|
|
|
*/
|
|
|
|
|
Packet *head;
|
For PktPool add local pending freed packets list.
Better handle the autofp case where one thread allocates the majority
of the packets and other threads free those packets.
Add a list of locally pending packets. The first packet freed goes on the
pending list, then subsequent freed packets for the same Packet Pool are
added to this list until it hits a fixed number of packets, then the
entire list of packets is pushed onto the pool's return stack. If a freed
packet is not for the pending pool, it is freed immediately to its pool's
return stack, as before.
For the autofp case, since there is only one Packet Pool doing all the
allocation, every other thread will keep a list of pending packets for
that pool.
For the worker run mode, most packets are allocated and freed locally. For
the case where packets are being returned to a remote pool, a pending list
will be kept for one of those other threads, all others are returned as before.
Which remote pool for which to keep a pending list is changed each time the
pending list is returned. Since the return pending pool is cleared when it is
freed, then next packet to be freed chooses the new pending pool.
12 years ago
|
|
|
/* Packets waiting (pending) to be returned to the given Packet
|
|
|
|
|
* Pool. Accumulate packets for the same pool until a theshold is
|
|
|
|
|
* reached, then return them all at once. Keep the head and tail
|
|
|
|
|
* to fast insertion of the entire list onto a return stack.
|
|
|
|
|
*/
|
|
|
|
|
struct PktPool_ *pending_pool;
|
|
|
|
|
Packet *pending_head;
|
|
|
|
|
Packet *pending_tail;
|
|
|
|
|
uint32_t pending_count;
|
|
|
|
|
|
|
|
|
|
/* All members above this point are accessed locally by only one thread, so
|
|
|
|
|
* these should live on their own cache line.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
/* Return stack, where other threads put packets that they free that belong
|
|
|
|
|
* to this thread.
|
|
|
|
|
*/
|
|
|
|
|
PktPoolLockedStack return_stack;
|
|
|
|
|
|
|
|
|
|
} PktPool;
|
|
|
|
|
|
|
|
|
|
Packet *TmqhInputPacketpool(ThreadVars *);
|
|
|
|
|
void TmqhOutputPacketpool(ThreadVars *, Packet *);
|
|
|
|
|
void TmqhReleasePacketsToPacketPool(PacketQueue *);
|
|
|
|
|
void TmqhPacketpoolRegister(void);
|
|
|
|
|
Packet *PacketPoolGetPacket(void);
|
|
|
|
|
void PacketPoolWait(void);
|
|
|
|
|
void PacketPoolReturnPacket(Packet *p);
|
|
|
|
|
void PacketPoolInit(void);
|
|
|
|
|
void PacketPoolDestroy(void);
|
|
|
|
|
|
|
|
|
|
#endif /* __TMQH_PACKETPOOL_H__ */
|