> -----Original Message----- > From: Jakub Kicinski <k...@kernel.org> > Sent: Monday, August 24, 2020 1:42 PM > To: Nguyen, Anthony L <anthony.l.ngu...@intel.com> > Cc: da...@davemloft.net; Michael, Alice <alice.mich...@intel.com>; > netdev@vger.kernel.org; nhor...@redhat.com; sassm...@redhat.com; > Kirsher, Jeffrey T <jeffrey.t.kirs...@intel.com>; Brady, Alan > <alan.br...@intel.com>; Burra, Phani R <phani.r.bu...@intel.com>; Hay, > Joshua A <joshua.a....@intel.com>; Chittim, Madhu > <madhu.chit...@intel.com>; Linga, Pavan Kumar > <pavan.kumar.li...@intel.com>; Skidmore, Donald C > <donald.c.skidm...@intel.com>; Brandeburg, Jesse > <jesse.brandeb...@intel.com>; Samudrala, Sridhar > <sridhar.samudr...@intel.com> > Subject: Re: [net-next v5 08/15] iecm: Implement vector allocation > > On Mon, 24 Aug 2020 10:32:59 -0700 Tony Nguyen wrote: > > static void iecm_mb_intr_rel_irq(struct iecm_adapter *adapter) { > > - /* stub */ > > + int irq_num; > > + > > + irq_num = adapter->msix_entries[0].vector; > > + synchronize_irq(irq_num); > > I don't think you need to sync irq before freeing it. >
I see other non-Intel drivers syncing before disable/free and Intel drivers have historically done it, not that that's necessarily correct, but are you certain? > > + free_irq(irq_num, adapter); > > > > static int iecm_mb_intr_init(struct iecm_adapter *adapter) { > > - /* stub */ > > + int err = 0; > > + > > + iecm_get_mb_vec_id(adapter); > > + adapter->dev_ops.reg_ops.mb_intr_reg_init(adapter); > > + adapter->irq_mb_handler = iecm_mb_intr_clean; > > + err = iecm_mb_intr_req_irq(adapter); > > + return err; > > return iecm_mb_intr_req_irq(adapter); > > > static void iecm_vport_intr_rel_irq(struct iecm_vport *vport) { > > - /* stub */ > > + struct iecm_adapter *adapter = vport->adapter; > > + int vector; > > + > > + for (vector = 0; vector < vport->num_q_vectors; vector++) { > > + struct iecm_q_vector *q_vector = &vport->q_vectors[vector]; > > + int irq_num, vidx; > > + > > + /* free only the IRQs that were actually requested */ > > + if (!q_vector) > > + continue; > > + > > + vidx = vector + vport->q_vector_base; > > + irq_num = adapter->msix_entries[vidx].vector; > > + > > + /* clear the affinity_mask in the IRQ descriptor */ > > + irq_set_affinity_hint(irq_num, NULL); > > + synchronize_irq(irq_num); > > here as well > > > + free_irq(irq_num, q_vector); > > + } > > } > > > void iecm_vport_intr_dis_irq_all(struct iecm_vport *vport) { > > - /* stub */ > > + struct iecm_q_vector *q_vector = vport->q_vectors; > > + struct iecm_hw *hw = &vport->adapter->hw; > > + int q_idx; > > + > > + for (q_idx = 0; q_idx < vport->num_q_vectors; q_idx++) > > + writel_relaxed(0, hw->hw_addr + > > + q_vector[q_idx].intr_reg.dyn_ctl); > > Why the use of _releaxed() here? is this performance-sensitive? > There is no barrier after, which makes this code fragile. > _relaxed not required here, will fix. -Alan