IB/hfi1: IB/hfi1: Add an API to handle special case drop

This patch pushes special case drop logic into an API to be shared by all
interrupt handlers.

Additionally, convert do_drop to a bool.

Link: https://lore.kernel.org/r/20200106134203.119356.36962.stgit@awfm-01.aw.intel.com
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Kaike Wan <kaike.wan@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
Mike Marciniszyn 2020-01-06 08:42:04 -05:00 committed by Jason Gunthorpe
parent 7b8a8b72c9
commit cd47b594db
3 changed files with 23 additions and 8 deletions

View File

@ -1004,11 +1004,7 @@ int handle_receive_interrupt(struct hfi1_ctxtdata *rcd, int thread)
prescan_rxq(rcd, &packet); prescan_rxq(rcd, &packet);
while (last == RCV_PKT_OK) { while (last == RCV_PKT_OK) {
if (unlikely(dd->do_drop && if (hfi1_need_drop(dd)) {
atomic_xchg(&dd->drop_packet, DROP_PACKET_OFF) ==
DROP_PACKET_ON)) {
dd->do_drop = 0;
/* On to the next packet */ /* On to the next packet */
packet.rhqoff += packet.rsize; packet.rhqoff += packet.rsize;
packet.rhf_addr = (__le32 *)rcd->rcvhdrq + packet.rhf_addr = (__le32 *)rcd->rcvhdrq +

View File

@ -1316,7 +1316,7 @@ struct hfi1_devdata {
struct err_info_constraint err_info_xmit_constraint; struct err_info_constraint err_info_xmit_constraint;
atomic_t drop_packet; atomic_t drop_packet;
u8 do_drop; bool do_drop;
u8 err_info_uncorrectable; u8 err_info_uncorrectable;
u8 err_info_fmconfig; u8 err_info_fmconfig;
@ -2462,6 +2462,25 @@ static inline bool is_integrated(struct hfi1_devdata *dd)
return dd->pcidev->device == PCI_DEVICE_ID_INTEL1; return dd->pcidev->device == PCI_DEVICE_ID_INTEL1;
} }
/**
* hfi1_need_drop - detect need for drop
* @dd: - the device
*
* In some cases, the first packet needs to be dropped.
*
* Return true is the current packet needs to be dropped and false otherwise.
*/
static inline bool hfi1_need_drop(struct hfi1_devdata *dd)
{
if (unlikely(dd->do_drop &&
atomic_xchg(&dd->drop_packet, DROP_PACKET_OFF) ==
DROP_PACKET_ON)) {
dd->do_drop = false;
return true;
}
return false;
}
int hfi1_tempsense_rd(struct hfi1_devdata *dd, struct hfi1_temp *temp); int hfi1_tempsense_rd(struct hfi1_devdata *dd, struct hfi1_temp *temp);
#define DD_DEV_ENTRY(dd) __string(dev, dev_name(&(dd)->pcidev->dev)) #define DD_DEV_ENTRY(dd) __string(dev, dev_name(&(dd)->pcidev->dev))

View File

@ -876,10 +876,10 @@ int hfi1_init(struct hfi1_devdata *dd, int reinit)
if (is_ax(dd)) { if (is_ax(dd)) {
atomic_set(&dd->drop_packet, DROP_PACKET_ON); atomic_set(&dd->drop_packet, DROP_PACKET_ON);
dd->do_drop = 1; dd->do_drop = true;
} else { } else {
atomic_set(&dd->drop_packet, DROP_PACKET_OFF); atomic_set(&dd->drop_packet, DROP_PACKET_OFF);
dd->do_drop = 0; dd->do_drop = false;
} }
/* make sure the link is not "up" */ /* make sure the link is not "up" */