Skip to content

Commit

Permalink
llc2: Collapse the station event receive path
Browse files Browse the repository at this point in the history
We only ever put one skb on the event queue, and then immediately
process it.  Remove the queue and fold together the related functions,
removing several blatantly false comments.

Signed-off-by: Ben Hutchings <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
bwhacks authored and davem330 committed Sep 17, 2012
1 parent 025e363 commit 04d191c
Showing 1 changed file with 6 additions and 81 deletions.
87 changes: 6 additions & 81 deletions net/llc/llc_station.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,9 @@
*
* @mac_sa: MAC source address
* @sap_list: list of related SAPs
* @ev_q: events entering state mach.
* @mac_pdu_q: PDUs ready to send to MAC
*/
struct llc_station {
struct {
struct sk_buff_head list;
spinlock_t lock;
} ev_q;
struct sk_buff_head mac_pdu_q;
};

Expand Down Expand Up @@ -215,79 +210,6 @@ static struct llc_station_state_trans *
return rc;
}

/**
* llc_station_free_ev - frees an event
* @skb: Address of the event
*
* Frees an event.
*/
static void llc_station_free_ev(struct sk_buff *skb)
{
kfree_skb(skb);
}

/**
* llc_station_next_state - processes event and goes to the next state
* @skb: Address of the event
*
* Processes an event, executes any transitions related to that event and
* updates the state of the station.
*/
static u16 llc_station_next_state(struct sk_buff *skb)
{
u16 rc = 1;
struct llc_station_state_trans *trans;

trans = llc_find_station_trans(skb);
if (trans)
/* got the state to which we next transition; perform the
* actions associated with this transition before actually
* transitioning to the next state
*/
rc = llc_exec_station_trans_actions(trans, skb);
else
/* event not recognized in current state; re-queue it for
* processing again at a later time; return failure
*/
rc = 0;
llc_station_free_ev(skb);
return rc;
}

/**
* llc_station_service_events - service events in the queue
*
* Get an event from the station event queue (if any); attempt to service
* the event; if event serviced, get the next event (if any) on the event
* queue; if event not service, re-queue the event on the event queue and
* attempt to service the next event; when serviced all events in queue,
* finished; if don't transition to different state, just service all
* events once; if transition to new state, service all events again.
* Caller must hold llc_main_station.ev_q.lock.
*/
static void llc_station_service_events(void)
{
struct sk_buff *skb;

while ((skb = skb_dequeue(&llc_main_station.ev_q.list)) != NULL)
llc_station_next_state(skb);
}

/**
* llc_station_state_process - queue event and try to process queue.
* @skb: Address of the event
*
* Queues an event (on the station event queue) for handling by the
* station state machine and attempts to process any queued-up events.
*/
static void llc_station_state_process(struct sk_buff *skb)
{
spin_lock_bh(&llc_main_station.ev_q.lock);
skb_queue_tail(&llc_main_station.ev_q.list, skb);
llc_station_service_events();
spin_unlock_bh(&llc_main_station.ev_q.lock);
}

/**
* llc_station_rcv - send received pdu to the station state machine
* @skb: received frame.
Expand All @@ -296,14 +218,17 @@ static void llc_station_state_process(struct sk_buff *skb)
*/
static void llc_station_rcv(struct sk_buff *skb)
{
llc_station_state_process(skb);
struct llc_station_state_trans *trans;

trans = llc_find_station_trans(skb);
if (trans)
llc_exec_station_trans_actions(trans, skb);
kfree_skb(skb);
}

void __init llc_station_init(void)
{
skb_queue_head_init(&llc_main_station.mac_pdu_q);
skb_queue_head_init(&llc_main_station.ev_q.list);
spin_lock_init(&llc_main_station.ev_q.lock);
llc_set_station_handler(llc_station_rcv);
}

Expand Down

0 comments on commit 04d191c

Please sign in to comment.