Commit ad8fc41c authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'net-convert-tasklets-to-use-new-tasklet_setup-api'

Allen Pais says:

====================
net: convert tasklets to use new tasklet_setup API

Commit 12cc923f ("tasklet: Introduce new initialization API")'
introduced a new tasklet initialization API. This series converts
all the net/* drivers to use the new tasklet_setup() API

The following series is based on net-next (9faebeb2)

v3:
 introduce qdisc_from_priv, suggested by Eric Dumazet.
v2:
  get rid of QDISC_ALIGN()
v1:
  fix kerneldoc
====================

Link: https://lore.kernel.org/r/20201103091823.586717-1-allen.lkml@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents ae0d0bb2 158d31da
...@@ -24,6 +24,11 @@ static inline void *qdisc_priv(struct Qdisc *q) ...@@ -24,6 +24,11 @@ static inline void *qdisc_priv(struct Qdisc *q)
return &q->privdata; return &q->privdata;
} }
static inline struct Qdisc *qdisc_from_priv(void *priv)
{
return container_of(priv, struct Qdisc, privdata);
}
/* /*
Timer resolution MUST BE < 10% of min_schedulable_packet_size/bandwidth Timer resolution MUST BE < 10% of min_schedulable_packet_size/bandwidth
......
...@@ -215,13 +215,14 @@ static void dccp_delack_timer(struct timer_list *t) ...@@ -215,13 +215,14 @@ static void dccp_delack_timer(struct timer_list *t)
/** /**
* dccp_write_xmitlet - Workhorse for CCID packet dequeueing interface * dccp_write_xmitlet - Workhorse for CCID packet dequeueing interface
* @data: Socket to act on * @t: pointer to the tasklet associated with this handler
* *
* See the comments above %ccid_dequeueing_decision for supported modes. * See the comments above %ccid_dequeueing_decision for supported modes.
*/ */
static void dccp_write_xmitlet(unsigned long data) static void dccp_write_xmitlet(struct tasklet_struct *t)
{ {
struct sock *sk = (struct sock *)data; struct dccp_sock *dp = from_tasklet(dp, t, dccps_xmitlet);
struct sock *sk = &dp->dccps_inet_connection.icsk_inet.sk;
bh_lock_sock(sk); bh_lock_sock(sk);
if (sock_owned_by_user(sk)) if (sock_owned_by_user(sk))
...@@ -235,16 +236,15 @@ static void dccp_write_xmitlet(unsigned long data) ...@@ -235,16 +236,15 @@ static void dccp_write_xmitlet(unsigned long data)
static void dccp_write_xmit_timer(struct timer_list *t) static void dccp_write_xmit_timer(struct timer_list *t)
{ {
struct dccp_sock *dp = from_timer(dp, t, dccps_xmit_timer); struct dccp_sock *dp = from_timer(dp, t, dccps_xmit_timer);
struct sock *sk = &dp->dccps_inet_connection.icsk_inet.sk;
dccp_write_xmitlet((unsigned long)sk); dccp_write_xmitlet(&dp->dccps_xmitlet);
} }
void dccp_init_xmit_timers(struct sock *sk) void dccp_init_xmit_timers(struct sock *sk)
{ {
struct dccp_sock *dp = dccp_sk(sk); struct dccp_sock *dp = dccp_sk(sk);
tasklet_init(&dp->dccps_xmitlet, dccp_write_xmitlet, (unsigned long)sk); tasklet_setup(&dp->dccps_xmitlet, dccp_write_xmitlet);
timer_setup(&dp->dccps_xmit_timer, dccp_write_xmit_timer, 0); timer_setup(&dp->dccps_xmit_timer, dccp_write_xmit_timer, 0);
inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer, inet_csk_init_xmit_timers(sk, &dccp_write_timer, &dccp_delack_timer,
&dccp_keepalive_timer); &dccp_keepalive_timer);
......
...@@ -1038,9 +1038,9 @@ static void tcp_tsq_handler(struct sock *sk) ...@@ -1038,9 +1038,9 @@ static void tcp_tsq_handler(struct sock *sk)
* transferring tsq->head because tcp_wfree() might * transferring tsq->head because tcp_wfree() might
* interrupt us (non NAPI drivers) * interrupt us (non NAPI drivers)
*/ */
static void tcp_tasklet_func(unsigned long data) static void tcp_tasklet_func(struct tasklet_struct *t)
{ {
struct tsq_tasklet *tsq = (struct tsq_tasklet *)data; struct tsq_tasklet *tsq = from_tasklet(tsq, t, tasklet);
LIST_HEAD(list); LIST_HEAD(list);
unsigned long flags; unsigned long flags;
struct list_head *q, *n; struct list_head *q, *n;
...@@ -1125,9 +1125,7 @@ void __init tcp_tasklet_init(void) ...@@ -1125,9 +1125,7 @@ void __init tcp_tasklet_init(void)
struct tsq_tasklet *tsq = &per_cpu(tsq_tasklet, i); struct tsq_tasklet *tsq = &per_cpu(tsq_tasklet, i);
INIT_LIST_HEAD(&tsq->head); INIT_LIST_HEAD(&tsq->head);
tasklet_init(&tsq->tasklet, tasklet_setup(&tsq->tasklet, tcp_tasklet_func);
tcp_tasklet_func,
(unsigned long)tsq);
} }
} }
......
...@@ -1795,7 +1795,7 @@ static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata) ...@@ -1795,7 +1795,7 @@ static inline bool ieee80211_sdata_running(struct ieee80211_sub_if_data *sdata)
/* tx handling */ /* tx handling */
void ieee80211_clear_tx_pending(struct ieee80211_local *local); void ieee80211_clear_tx_pending(struct ieee80211_local *local);
void ieee80211_tx_pending(unsigned long data); void ieee80211_tx_pending(struct tasklet_struct *t);
netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb, netdev_tx_t ieee80211_monitor_start_xmit(struct sk_buff *skb,
struct net_device *dev); struct net_device *dev);
netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
...@@ -2146,7 +2146,7 @@ void ieee80211_txq_remove_vlan(struct ieee80211_local *local, ...@@ -2146,7 +2146,7 @@ void ieee80211_txq_remove_vlan(struct ieee80211_local *local,
struct ieee80211_sub_if_data *sdata); struct ieee80211_sub_if_data *sdata);
void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats, void ieee80211_fill_txq_stats(struct cfg80211_txq_stats *txqstats,
struct txq_info *txqi); struct txq_info *txqi);
void ieee80211_wake_txqs(unsigned long data); void ieee80211_wake_txqs(struct tasklet_struct *t);
void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
u16 transaction, u16 auth_alg, u16 status, u16 transaction, u16 auth_alg, u16 status,
const u8 *extra, size_t extra_len, const u8 *bssid, const u8 *extra, size_t extra_len, const u8 *bssid,
......
...@@ -220,9 +220,9 @@ u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata) ...@@ -220,9 +220,9 @@ u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata)
BSS_CHANGED_ERP_SLOT; BSS_CHANGED_ERP_SLOT;
} }
static void ieee80211_tasklet_handler(unsigned long data) static void ieee80211_tasklet_handler(struct tasklet_struct *t)
{ {
struct ieee80211_local *local = (struct ieee80211_local *) data; struct ieee80211_local *local = from_tasklet(local, t, tasklet);
struct sk_buff *skb; struct sk_buff *skb;
while ((skb = skb_dequeue(&local->skb_queue)) || while ((skb = skb_dequeue(&local->skb_queue)) ||
...@@ -733,16 +733,12 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len, ...@@ -733,16 +733,12 @@ struct ieee80211_hw *ieee80211_alloc_hw_nm(size_t priv_data_len,
skb_queue_head_init(&local->pending[i]); skb_queue_head_init(&local->pending[i]);
atomic_set(&local->agg_queue_stop[i], 0); atomic_set(&local->agg_queue_stop[i], 0);
} }
tasklet_init(&local->tx_pending_tasklet, ieee80211_tx_pending, tasklet_setup(&local->tx_pending_tasklet, ieee80211_tx_pending);
(unsigned long)local);
if (ops->wake_tx_queue) if (ops->wake_tx_queue)
tasklet_init(&local->wake_txqs_tasklet, ieee80211_wake_txqs, tasklet_setup(&local->wake_txqs_tasklet, ieee80211_wake_txqs);
(unsigned long)local);
tasklet_init(&local->tasklet, tasklet_setup(&local->tasklet, ieee80211_tasklet_handler);
ieee80211_tasklet_handler,
(unsigned long) local);
skb_queue_head_init(&local->skb_queue); skb_queue_head_init(&local->skb_queue);
skb_queue_head_init(&local->skb_queue_unreliable); skb_queue_head_init(&local->skb_queue_unreliable);
......
...@@ -4418,9 +4418,10 @@ static bool ieee80211_tx_pending_skb(struct ieee80211_local *local, ...@@ -4418,9 +4418,10 @@ static bool ieee80211_tx_pending_skb(struct ieee80211_local *local,
/* /*
* Transmit all pending packets. Called from tasklet. * Transmit all pending packets. Called from tasklet.
*/ */
void ieee80211_tx_pending(unsigned long data) void ieee80211_tx_pending(struct tasklet_struct *t)
{ {
struct ieee80211_local *local = (struct ieee80211_local *)data; struct ieee80211_local *local = from_tasklet(local, t,
tx_pending_tasklet);
unsigned long flags; unsigned long flags;
int i; int i;
bool txok; bool txok;
......
...@@ -386,9 +386,10 @@ _ieee80211_wake_txqs(struct ieee80211_local *local, unsigned long *flags) ...@@ -386,9 +386,10 @@ _ieee80211_wake_txqs(struct ieee80211_local *local, unsigned long *flags)
rcu_read_unlock(); rcu_read_unlock();
} }
void ieee80211_wake_txqs(unsigned long data) void ieee80211_wake_txqs(struct tasklet_struct *t)
{ {
struct ieee80211_local *local = (struct ieee80211_local *)data; struct ieee80211_local *local = from_tasklet(local, t,
wake_txqs_tasklet);
unsigned long flags; unsigned long flags;
spin_lock_irqsave(&local->queue_stop_reason_lock, flags); spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
......
...@@ -20,9 +20,9 @@ ...@@ -20,9 +20,9 @@
#include "ieee802154_i.h" #include "ieee802154_i.h"
#include "cfg.h" #include "cfg.h"
static void ieee802154_tasklet_handler(unsigned long data) static void ieee802154_tasklet_handler(struct tasklet_struct *t)
{ {
struct ieee802154_local *local = (struct ieee802154_local *)data; struct ieee802154_local *local = from_tasklet(local, t, tasklet);
struct sk_buff *skb; struct sk_buff *skb;
while ((skb = skb_dequeue(&local->skb_queue))) { while ((skb = skb_dequeue(&local->skb_queue))) {
...@@ -91,9 +91,7 @@ ieee802154_alloc_hw(size_t priv_data_len, const struct ieee802154_ops *ops) ...@@ -91,9 +91,7 @@ ieee802154_alloc_hw(size_t priv_data_len, const struct ieee802154_ops *ops)
INIT_LIST_HEAD(&local->interfaces); INIT_LIST_HEAD(&local->interfaces);
mutex_init(&local->iflist_mtx); mutex_init(&local->iflist_mtx);
tasklet_init(&local->tasklet, tasklet_setup(&local->tasklet, ieee802154_tasklet_handler);
ieee802154_tasklet_handler,
(unsigned long)local);
skb_queue_head_init(&local->skb_queue); skb_queue_head_init(&local->skb_queue);
......
...@@ -466,10 +466,10 @@ drop: __maybe_unused ...@@ -466,10 +466,10 @@ drop: __maybe_unused
* non-ATM interfaces. * non-ATM interfaces.
*/ */
static void sch_atm_dequeue(unsigned long data) static void sch_atm_dequeue(struct tasklet_struct *t)
{ {
struct Qdisc *sch = (struct Qdisc *)data; struct atm_qdisc_data *p = from_tasklet(p, t, task);
struct atm_qdisc_data *p = qdisc_priv(sch); struct Qdisc *sch = qdisc_from_priv(p);
struct atm_flow_data *flow; struct atm_flow_data *flow;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -563,7 +563,7 @@ static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt, ...@@ -563,7 +563,7 @@ static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt,
if (err) if (err)
return err; return err;
tasklet_init(&p->task, sch_atm_dequeue, (unsigned long)sch); tasklet_setup(&p->task, sch_atm_dequeue);
return 0; return 0;
} }
......
...@@ -389,9 +389,9 @@ static void smc_cdc_msg_recv(struct smc_sock *smc, struct smc_cdc_msg *cdc) ...@@ -389,9 +389,9 @@ static void smc_cdc_msg_recv(struct smc_sock *smc, struct smc_cdc_msg *cdc)
* Context: * Context:
* - tasklet context * - tasklet context
*/ */
static void smcd_cdc_rx_tsklet(unsigned long data) static void smcd_cdc_rx_tsklet(struct tasklet_struct *t)
{ {
struct smc_connection *conn = (struct smc_connection *)data; struct smc_connection *conn = from_tasklet(conn, t, rx_tsklet);
struct smcd_cdc_msg *data_cdc; struct smcd_cdc_msg *data_cdc;
struct smcd_cdc_msg cdc; struct smcd_cdc_msg cdc;
struct smc_sock *smc; struct smc_sock *smc;
...@@ -411,7 +411,7 @@ static void smcd_cdc_rx_tsklet(unsigned long data) ...@@ -411,7 +411,7 @@ static void smcd_cdc_rx_tsklet(unsigned long data)
*/ */
void smcd_cdc_rx_init(struct smc_connection *conn) void smcd_cdc_rx_init(struct smc_connection *conn)
{ {
tasklet_init(&conn->rx_tsklet, smcd_cdc_rx_tsklet, (unsigned long)conn); tasklet_setup(&conn->rx_tsklet, smcd_cdc_rx_tsklet);
} }
/***************************** init, exit, misc ******************************/ /***************************** init, exit, misc ******************************/
......
...@@ -131,9 +131,9 @@ static inline void smc_wr_tx_process_cqe(struct ib_wc *wc) ...@@ -131,9 +131,9 @@ static inline void smc_wr_tx_process_cqe(struct ib_wc *wc)
wake_up(&link->wr_tx_wait); wake_up(&link->wr_tx_wait);
} }
static void smc_wr_tx_tasklet_fn(unsigned long data) static void smc_wr_tx_tasklet_fn(struct tasklet_struct *t)
{ {
struct smc_ib_device *dev = (struct smc_ib_device *)data; struct smc_ib_device *dev = from_tasklet(dev, t, send_tasklet);
struct ib_wc wc[SMC_WR_MAX_POLL_CQE]; struct ib_wc wc[SMC_WR_MAX_POLL_CQE];
int i = 0, rc; int i = 0, rc;
int polled = 0; int polled = 0;
...@@ -435,9 +435,9 @@ static inline void smc_wr_rx_process_cqes(struct ib_wc wc[], int num) ...@@ -435,9 +435,9 @@ static inline void smc_wr_rx_process_cqes(struct ib_wc wc[], int num)
} }
} }
static void smc_wr_rx_tasklet_fn(unsigned long data) static void smc_wr_rx_tasklet_fn(struct tasklet_struct *t)
{ {
struct smc_ib_device *dev = (struct smc_ib_device *)data; struct smc_ib_device *dev = from_tasklet(dev, t, recv_tasklet);
struct ib_wc wc[SMC_WR_MAX_POLL_CQE]; struct ib_wc wc[SMC_WR_MAX_POLL_CQE];
int polled = 0; int polled = 0;
int rc; int rc;
...@@ -698,10 +698,8 @@ void smc_wr_remove_dev(struct smc_ib_device *smcibdev) ...@@ -698,10 +698,8 @@ void smc_wr_remove_dev(struct smc_ib_device *smcibdev)
void smc_wr_add_dev(struct smc_ib_device *smcibdev) void smc_wr_add_dev(struct smc_ib_device *smcibdev)
{ {
tasklet_init(&smcibdev->recv_tasklet, smc_wr_rx_tasklet_fn, tasklet_setup(&smcibdev->recv_tasklet, smc_wr_rx_tasklet_fn);
(unsigned long)smcibdev); tasklet_setup(&smcibdev->send_tasklet, smc_wr_tx_tasklet_fn);
tasklet_init(&smcibdev->send_tasklet, smc_wr_tx_tasklet_fn,
(unsigned long)smcibdev);
} }
int smc_wr_create_link(struct smc_link *lnk) int smc_wr_create_link(struct smc_link *lnk)
......
...@@ -760,9 +760,9 @@ int xfrm_input_resume(struct sk_buff *skb, int nexthdr) ...@@ -760,9 +760,9 @@ int xfrm_input_resume(struct sk_buff *skb, int nexthdr)
} }
EXPORT_SYMBOL(xfrm_input_resume); EXPORT_SYMBOL(xfrm_input_resume);
static void xfrm_trans_reinject(unsigned long data) static void xfrm_trans_reinject(struct tasklet_struct *t)
{ {
struct xfrm_trans_tasklet *trans = (void *)data; struct xfrm_trans_tasklet *trans = from_tasklet(trans, t, tasklet);
struct sk_buff_head queue; struct sk_buff_head queue;
struct sk_buff *skb; struct sk_buff *skb;
...@@ -818,7 +818,6 @@ void __init xfrm_input_init(void) ...@@ -818,7 +818,6 @@ void __init xfrm_input_init(void)
trans = &per_cpu(xfrm_trans_tasklet, i); trans = &per_cpu(xfrm_trans_tasklet, i);
__skb_queue_head_init(&trans->queue); __skb_queue_head_init(&trans->queue);
tasklet_init(&trans->tasklet, xfrm_trans_reinject, tasklet_setup(&trans->tasklet, xfrm_trans_reinject);
(unsigned long)trans);
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment