|
@@ -5066,15 +5066,20 @@ bool sk_busy_loop(struct sock *sk, int nonblock)
|
|
|
int (*napi_poll)(struct napi_struct *napi, int budget);
|
|
|
void *have_poll_lock = NULL;
|
|
|
struct napi_struct *napi;
|
|
|
+ unsigned int napi_id;
|
|
|
int rc;
|
|
|
|
|
|
restart:
|
|
|
+ napi_id = READ_ONCE(sk->sk_napi_id);
|
|
|
+ if (napi_id < MIN_NAPI_ID)
|
|
|
+ return 0;
|
|
|
+
|
|
|
rc = false;
|
|
|
napi_poll = NULL;
|
|
|
|
|
|
rcu_read_lock();
|
|
|
|
|
|
- napi = napi_by_id(sk->sk_napi_id);
|
|
|
+ napi = napi_by_id(napi_id);
|
|
|
if (!napi)
|
|
|
goto out;
|
|
|
|
|
@@ -5143,10 +5148,10 @@ static void napi_hash_add(struct napi_struct *napi)
|
|
|
|
|
|
spin_lock(&napi_hash_lock);
|
|
|
|
|
|
- /* 0..NR_CPUS+1 range is reserved for sender_cpu use */
|
|
|
+ /* 0..NR_CPUS range is reserved for sender_cpu use */
|
|
|
do {
|
|
|
- if (unlikely(++napi_gen_id < NR_CPUS + 1))
|
|
|
- napi_gen_id = NR_CPUS + 1;
|
|
|
+ if (unlikely(++napi_gen_id < MIN_NAPI_ID))
|
|
|
+ napi_gen_id = MIN_NAPI_ID;
|
|
|
} while (napi_by_id(napi_gen_id));
|
|
|
napi->napi_id = napi_gen_id;
|
|
|
|