net/core/gro_cells.c
Source file repositories/reference/linux-study-clean/net/core/gro_cells.c
File Facts
- System
- Linux kernel
- Corpus path
net/core/gro_cells.c- Extension
.c- Size
- 3546 bytes
- Lines
- 149
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/skbuff.hlinux/slab.hlinux/netdevice.hnet/gro_cells.hnet/hotdata.h
Detected Declarations
struct gro_cellstruct percpu_free_deferfunction gro_cells_receivefunction gro_cell_pollfunction gro_cells_initfunction for_each_possible_cpufunction percpu_free_defer_callbackfunction gro_cells_destroyexport gro_cells_receiveexport gro_cells_initexport gro_cells_destroy
Annotated Snippet
struct gro_cell {
struct sk_buff_head napi_skbs;
struct napi_struct napi;
local_lock_t bh_lock;
};
int gro_cells_receive(struct gro_cells *gcells, struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
bool have_bh_lock = false;
struct gro_cell *cell;
int res;
rcu_read_lock();
if (unlikely(!(dev->flags & IFF_UP)))
goto drop;
if (!gcells->cells || skb_cloned(skb) || netif_elide_gro(dev)) {
res = netif_rx(skb);
goto unlock;
}
local_lock_nested_bh(&gcells->cells->bh_lock);
have_bh_lock = true;
cell = this_cpu_ptr(gcells->cells);
if (skb_queue_len(&cell->napi_skbs) > READ_ONCE(net_hotdata.max_backlog)) {
drop:
dev_core_stats_rx_dropped_inc(dev);
kfree_skb(skb);
res = NET_RX_DROP;
goto unlock;
}
__skb_queue_tail(&cell->napi_skbs, skb);
if (skb_queue_len(&cell->napi_skbs) == 1)
napi_schedule(&cell->napi);
res = NET_RX_SUCCESS;
unlock:
if (have_bh_lock)
local_unlock_nested_bh(&gcells->cells->bh_lock);
rcu_read_unlock();
return res;
}
EXPORT_SYMBOL(gro_cells_receive);
/* called under BH context */
static int gro_cell_poll(struct napi_struct *napi, int budget)
{
struct gro_cell *cell = container_of(napi, struct gro_cell, napi);
struct sk_buff *skb;
int work_done = 0;
while (work_done < budget) {
__local_lock_nested_bh(&cell->bh_lock);
skb = __skb_dequeue(&cell->napi_skbs);
__local_unlock_nested_bh(&cell->bh_lock);
if (!skb)
break;
napi_gro_receive(napi, skb);
work_done++;
}
if (work_done < budget)
napi_complete_done(napi, work_done);
return work_done;
}
int gro_cells_init(struct gro_cells *gcells, struct net_device *dev)
{
int i;
gcells->cells = alloc_percpu(struct gro_cell);
if (!gcells->cells)
return -ENOMEM;
for_each_possible_cpu(i) {
struct gro_cell *cell = per_cpu_ptr(gcells->cells, i);
__skb_queue_head_init(&cell->napi_skbs);
local_lock_init(&cell->bh_lock);
set_bit(NAPI_STATE_NO_BUSY_POLL, &cell->napi.state);
netif_napi_add(dev, &cell->napi, gro_cell_poll);
napi_enable(&cell->napi);
}
return 0;
Annotation
- Immediate include surface: `linux/skbuff.h`, `linux/slab.h`, `linux/netdevice.h`, `net/gro_cells.h`, `net/hotdata.h`.
- Detected declarations: `struct gro_cell`, `struct percpu_free_defer`, `function gro_cells_receive`, `function gro_cell_poll`, `function gro_cells_init`, `function for_each_possible_cpu`, `function percpu_free_defer_callback`, `function gro_cells_destroy`, `export gro_cells_receive`, `export gro_cells_init`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.