首页 > 其他分享 >网络设备NAPI能力

网络设备NAPI能力

时间:2023-06-01 10:36:39浏览次数:49  
标签:struct weight list 能力 NAPI 网络设备 poll napi

void netif_napi_add(struct net_device *dev, struct napi_struct *napi,
   int (*poll)(struct napi_struct *, int), int weight)
 {
INIT_LIST_HEAD(&napi->poll_list);
hrtimer_init(&napi->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED);
napi->timer.function = napi_watchdog;
napi->gro_count = 0;
napi->gro_list = NULL;
napi->skb = NULL;
napi->poll = poll;
if (weight > NAPI_POLL_WEIGHT)
pr_err_once("netif_napi_add() called with weight %d on device %s\n",
   weight, dev->name);
napi->weight = weight;
list_add(&napi->dev_list, &dev->napi_list);
napi->dev = dev;
 #ifdef CONFIG_NETPOLL
spin_lock_init(&napi->poll_lock);
napi->poll_owner = -1;
 #endif
set_bit(NAPI_STATE_SCHED, &napi->state);
napi_hash_add(napi);
 }
 EXPORT_SYMBOL(netif_napi_add);
 static int napi_poll(struct napi_struct *n, struct list_head *repoll)
 {
void *have;
int work, weight;


list_del_init(&n->poll_list);


have = netpoll_poll_lock(n);


weight = n->weight;


/* This NAPI_STATE_SCHED test is for avoiding a race
* with netpoll's poll_napi().  Only the entity which
* obtains the lock and sees NAPI_STATE_SCHED set will
* actually make the ->poll() call.  Therefore we avoid
* accidentally calling ->poll() when NAPI is not scheduled.
*/
work = 0;
if (test_bit(NAPI_STATE_SCHED, &n->state)) {
work = n->poll(n, weight);
trace_napi_poll(n);
}


WARN_ON_ONCE(work > weight);


if (likely(work < weight))
goto out_unlock;


/* Drivers must not modify the NAPI state if they
* consume the entire weight.  In such cases this code
* still "owns" the NAPI instance and therefore can
* move the instance around on the list at-will.
*/
if (unlikely(napi_disable_pending(n))) {
napi_complete(n);
goto out_unlock;
}


if (n->gro_list) {
/* flush too old packets
* If HZ < 1000, flush all packets.
*/
napi_gro_flush(n, HZ >= 1000);
}


/* Some drivers may have called napi_schedule
* prior to exhausting their budget.
*/
if (unlikely(!list_empty(&n->poll_list))) {
pr_warn_once("%s: Budget exhausted after napi rescheduled\n",
    n->dev ? n->dev->name : "backlog");
goto out_unlock;
}


list_add_tail(&n->poll_list, repoll);


 out_unlock:
netpoll_poll_unlock(have);


return work;
 }
 static void net_rx_action(struct softirq_action *h)
 {
struct softnet_data *sd = this_cpu_ptr(&softnet_data);
unsigned long time_limit = jiffies + 2;
int budget = netdev_budget;
LIST_HEAD(list);
LIST_HEAD(repoll);


local_irq_disable();
list_splice_init(&sd->poll_list, &list);
local_irq_enable();


for (;;) {
struct napi_struct *n;


if (list_empty(&list)) {
if (!sd_has_rps_ipi_waiting(sd) && list_empty(&repoll))
return;
break;
}


n = list_first_entry(&list, struct napi_struct, poll_list);
budget -= napi_poll(n, &repoll);


/* If softirq window is exhausted then punt.
* Allow this to run for 2 jiffies since which will allow
* an average latency of 1.5/HZ.
*/
if (unlikely(budget <= 0 ||
    time_after_eq(jiffies, time_limit))) {
sd->time_squeeze++;
break;
}
}


__kfree_skb_flush();
local_irq_disable();


list_splice_tail_init(&sd->poll_list, &list);
list_splice_tail(&repoll, &list);
list_splice(&list, &sd->poll_list);
if (!list_empty(&sd->poll_list))
__raise_softirq_irqoff(NET_RX_SOFTIRQ);


net_rps_action_and_irq_enable(sd);
 }

标签:struct,weight,list,能力,NAPI,网络设备,poll,napi
From: https://blog.51cto.com/u_11860992/6392696

相关文章

  • 肖sir__现场笔试__三角形测试用例和网络设备通信(杭州)
    =======================================  设备A:- IP地址: 192.168.1.2- 子网掩码: 255.255.255.0- 网关: 192.168.1.1设备B:- IP地址: 192.168.2.2- 子网掩码: 255.255.255.0- 网关: 192.168.2.1端口A(连接设备A):- IP地址: 192.168.1.1- 子网掩码: 255.25......
  • 不懂这10个命令,别说你会调试网络设备
    我的网工朋友大家好啊好久没跟你们聊思科设备了。虽然目前大方向上,企业用的设备越来越偏向国产化,学习华为、华三等厂商知识的人也越来越多。但不可否认的是,思科仍然是厂商老大哥。交换机、路由器这两块,思科占的全球市场份额还是大。目前一些外企或是大厂原厂,也还是有一些仅招思科方......
  • 你问我做技术研发需要哪些能力?
    要回答者问题其实很简单,咱们把眼光投射到具体的公司上。首先先需要明确公司找一个人来是要做什么?显而易见,就是要去负责一块儿业务。那么,负责一块儿业务应该具备哪些能力呢?一、技术能力这个是基础,无需多言,厨师不配刀还叫什么厨师!不同的公司有着不同的业务,或者即便是相同的业......
  • 运维工程师缺乏开发能力或者说没有开发思维可能会...
    这年头,运维人员要求要懂开发了,不信去BOSS招聘上看看,要求上都写着最好是懂Python、Golang或Java其中之一。可见,运维工程师如果不具备一点开发能力,估计是不好混呀!那为啥要求运维人员需要具备一定的开发能力呢?我认为是自动化运维和DevOps文化的兴起所致。自动化和DevOps早都是大势所......
  • 架构师成长需要具备的三种能力
    1、思考力思考力是在我们生活和工作中,通过独立思考带来有效结论的能力。首先是独立思考。独立,并不是避免跟别人讨论,或者是不上网查资料、不参加会议。而是指得出的结论,主要来自如下三个方面:有别于其他人的视角;不同的证据组合;不同的思维方式。其次是“有效”,也就是为公司或团队带来......
  • 浪潮信息入围Gartner全球服务器标杆厂商 多项能力获得认可
    近日,Gartner发布全球服务器市场指南《MarketGuideforServers》,从市场定义、市场方向、市场规模等角度对全球服务器厂商进行全面评估与研究,并甄选出代表性厂商,是全球用户进行服务器选型的重要参考和依据。浪潮信息入围全球服务器标杆厂商,在液冷、开放计算等多方面能力获得高度认......
  • 微信公众号开发---基础消息能力开发
    微信公众号接收普通消息1.配置开发服务器微信公众平台->开发->开发者工具->公众平台测试账号appid:是微信公众号的唯一标识,通过和appsecret进行验证。URL:开发服务器的路径,接收微信服务器发送的数据。Token:自设定的token,和开发服务器中进行验证的token保持一致。微信公众号用户,......
  • upc 6621: HSI(数学期望,数学推导能力)
    6621:HSI时间限制:1Sec  内存限制:128MB提交:544  解决:112[提交][状态][讨论版][命题人:admin]题目描述Takahashiisnowcompetinginaprogrammingcontest,buthereceivedTLEinaproblemwheretheanswerisYESorNO.Whenhecheckedthedetaileds......
  • 程序员如何提升解决横向问题的能力
    横向问题,简单来说就是软件系统内部与业务无关的技术债,比如性能、可扩展性、可用性、可测试性、可维护性和安全合规等问题。这些问题都属于非功能性需求,也就是说,产品经理一般不会把这些问题直接写在需求文档里。可是日积月累,这些技术债必然会成为整个团队的负担,影响软件的整体质量。......
  • 如何提升结构化设计的能力?
    软件架构能力指的是为相对复杂的场景定义并引导实施结构化软件方案的能力,其中结构化,代表这个软件在其设计范围内的设计理念、代码结构和实现方式上是同质的。提升结构化设计能力的起点,其实就是代码的结构性。不过在结构性之前,还有个更朴素的起点,就是代码的整洁性。在互联网时代,代码......