diff options
author | Jakub Kicinski <jakub.kicinski@netronome.com> | 2019-06-11 07:40:05 +0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-06-11 22:22:27 +0300 |
commit | e2c7114a12363eef7c3104ce223a0084d1800458 (patch) | |
tree | d102f6667eb44ca335afd468b0947beef210edab /drivers/net/ethernet/netronome/nfp/nfp_net.h | |
parent | d7053e0433c2f6a53c049548500f6037c955b2c9 (diff) | |
download | linux-e2c7114a12363eef7c3104ce223a0084d1800458.tar.xz |
nfp: add async version of mailbox communication
Some control messages must be sent from atomic context. The mailbox
takes sleeping locks and uses a waitqueue so add a "posted" version
of communication.
Trylock the semaphore and if that's successful kick of the device
communication. The device communication will be completed from
a workqueue, which will also release the semaphore.
If locks are taken queue the message and return. Schedule a
different workqueue to take the semaphore and run the communication.
Note that the there are currently no atomic users which would actually
need the return value, so all replies to posted messages are just
freed.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/nfp_net.h')
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/nfp_net.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h index 7bfc819d1e85..46305f181764 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h @@ -19,6 +19,7 @@ #include <linux/pci.h> #include <linux/io-64-nonatomic-hi-lo.h> #include <linux/semaphore.h> +#include <linux/workqueue.h> #include <net/xdp.h> #include "nfp_net_ctrl.h" @@ -586,6 +587,9 @@ struct nfp_net_dp { * @mbox_cmsg: Common Control Message via vNIC mailbox state * @mbox_cmsg.queue: CCM mbox queue of pending messages * @mbox_cmsg.wq: CCM mbox wait queue of waiting processes + * @mbox_cmsg.workq: CCM mbox work queue for @wait_work and @runq_work + * @mbox_cmsg.wait_work: CCM mbox posted msg reconfig wait work + * @mbox_cmsg.runq_work: CCM mbox posted msg queue runner work * @mbox_cmsg.tag: CCM mbox message tag allocator * @debugfs_dir: Device directory in debugfs * @vnic_list: Entry on device vNIC list @@ -669,6 +673,9 @@ struct nfp_net { struct { struct sk_buff_head queue; wait_queue_head_t wq; + struct workqueue_struct *workq; + struct work_struct wait_work; + struct work_struct runq_work; u16 tag; } mbox_cmsg; @@ -886,6 +893,11 @@ static inline void nn_ctrl_bar_lock(struct nfp_net *nn) down(&nn->bar_lock); } +static inline bool nn_ctrl_bar_trylock(struct nfp_net *nn) +{ + return !down_trylock(&nn->bar_lock); +} + static inline void nn_ctrl_bar_unlock(struct nfp_net *nn) { up(&nn->bar_lock); @@ -927,6 +939,8 @@ void nfp_net_coalesce_write_cfg(struct nfp_net *nn); int nfp_net_mbox_lock(struct nfp_net *nn, unsigned int data_size); int nfp_net_mbox_reconfig(struct nfp_net *nn, u32 mbox_cmd); int nfp_net_mbox_reconfig_and_unlock(struct nfp_net *nn, u32 mbox_cmd); +void nfp_net_mbox_reconfig_post(struct nfp_net *nn, u32 update); +int nfp_net_mbox_reconfig_wait_posted(struct nfp_net *nn); unsigned int nfp_net_irqs_alloc(struct pci_dev *pdev, struct msix_entry *irq_entries, |