Merge ef79f2dec7 ("tracing: Correct the refcount if the hist/hist_debug file fails to open") into android16-6.12
Steps on the way to 6.12.23 Resolves merge conflicts in: net/ipv4/udp.c Change-Id: Ida343c74a69a3f4c3f358486ef6339b55a5e6afe Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -1549,7 +1549,7 @@ static int gfx_v11_0_sw_init(void *handle)
|
||||
adev->gfx.me.num_me = 1;
|
||||
adev->gfx.me.num_pipe_per_me = 1;
|
||||
adev->gfx.me.num_queue_per_pipe = 1;
|
||||
adev->gfx.mec.num_mec = 2;
|
||||
adev->gfx.mec.num_mec = 1;
|
||||
adev->gfx.mec.num_pipe_per_mec = 4;
|
||||
adev->gfx.mec.num_queue_per_pipe = 4;
|
||||
break;
|
||||
|
||||
@@ -1332,7 +1332,7 @@ static int gfx_v12_0_sw_init(void *handle)
|
||||
adev->gfx.me.num_me = 1;
|
||||
adev->gfx.me.num_pipe_per_me = 1;
|
||||
adev->gfx.me.num_queue_per_pipe = 1;
|
||||
adev->gfx.mec.num_mec = 2;
|
||||
adev->gfx.mec.num_mec = 1;
|
||||
adev->gfx.mec.num_pipe_per_mec = 2;
|
||||
adev->gfx.mec.num_queue_per_pipe = 4;
|
||||
break;
|
||||
|
||||
@@ -251,18 +251,33 @@ static int com20020pci_probe(struct pci_dev *pdev,
|
||||
card->tx_led.default_trigger = devm_kasprintf(&pdev->dev,
|
||||
GFP_KERNEL, "arc%d-%d-tx",
|
||||
dev->dev_id, i);
|
||||
if (!card->tx_led.default_trigger) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_arcdev;
|
||||
}
|
||||
card->tx_led.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"pci:green:tx:%d-%d",
|
||||
dev->dev_id, i);
|
||||
|
||||
if (!card->tx_led.name) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_arcdev;
|
||||
}
|
||||
card->tx_led.dev = &dev->dev;
|
||||
card->recon_led.brightness_set = led_recon_set;
|
||||
card->recon_led.default_trigger = devm_kasprintf(&pdev->dev,
|
||||
GFP_KERNEL, "arc%d-%d-recon",
|
||||
dev->dev_id, i);
|
||||
if (!card->recon_led.default_trigger) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_arcdev;
|
||||
}
|
||||
card->recon_led.name = devm_kasprintf(&pdev->dev, GFP_KERNEL,
|
||||
"pci:red:recon:%d-%d",
|
||||
dev->dev_id, i);
|
||||
if (!card->recon_led.name) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_arcdev;
|
||||
}
|
||||
card->recon_led.dev = &dev->dev;
|
||||
|
||||
ret = devm_led_classdev_register(&pdev->dev, &card->tx_led);
|
||||
|
||||
@@ -7301,13 +7301,13 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev)
|
||||
err = mv88e6xxx_switch_reset(chip);
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
if (err)
|
||||
goto out;
|
||||
goto out_phy;
|
||||
|
||||
if (np) {
|
||||
chip->irq = of_irq_get(np, 0);
|
||||
if (chip->irq == -EPROBE_DEFER) {
|
||||
err = chip->irq;
|
||||
goto out;
|
||||
goto out_phy;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7326,7 +7326,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev)
|
||||
mv88e6xxx_reg_unlock(chip);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
goto out_phy;
|
||||
|
||||
if (chip->info->g2_irqs > 0) {
|
||||
err = mv88e6xxx_g2_irq_setup(chip);
|
||||
@@ -7360,6 +7360,8 @@ out_g1_irq:
|
||||
mv88e6xxx_g1_irq_free(chip);
|
||||
else
|
||||
mv88e6xxx_irq_poll_free(chip);
|
||||
out_phy:
|
||||
mv88e6xxx_phy_destroy(chip);
|
||||
out:
|
||||
if (pdata)
|
||||
dev_put(pdata->netdev);
|
||||
@@ -7382,7 +7384,6 @@ static void mv88e6xxx_remove(struct mdio_device *mdiodev)
|
||||
mv88e6xxx_ptp_free(chip);
|
||||
}
|
||||
|
||||
mv88e6xxx_phy_destroy(chip);
|
||||
mv88e6xxx_unregister_switch(chip);
|
||||
|
||||
mv88e6xxx_g1_vtu_prob_irq_free(chip);
|
||||
@@ -7395,6 +7396,8 @@ static void mv88e6xxx_remove(struct mdio_device *mdiodev)
|
||||
mv88e6xxx_g1_irq_free(chip);
|
||||
else
|
||||
mv88e6xxx_irq_poll_free(chip);
|
||||
|
||||
mv88e6xxx_phy_destroy(chip);
|
||||
}
|
||||
|
||||
static void mv88e6xxx_shutdown(struct mdio_device *mdiodev)
|
||||
|
||||
@@ -229,7 +229,10 @@ static void mv88e6xxx_phy_ppu_state_init(struct mv88e6xxx_chip *chip)
|
||||
|
||||
static void mv88e6xxx_phy_ppu_state_destroy(struct mv88e6xxx_chip *chip)
|
||||
{
|
||||
mutex_lock(&chip->ppu_mutex);
|
||||
del_timer_sync(&chip->ppu_timer);
|
||||
cancel_work_sync(&chip->ppu_work);
|
||||
mutex_unlock(&chip->ppu_mutex);
|
||||
}
|
||||
|
||||
int mv88e6185_phy_ppu_read(struct mv88e6xxx_chip *chip, struct mii_bus *bus,
|
||||
|
||||
@@ -1802,18 +1802,22 @@ static ssize_t veth_pool_store(struct kobject *kobj, struct attribute *attr,
|
||||
long value = simple_strtol(buf, NULL, 10);
|
||||
long rc;
|
||||
|
||||
rtnl_lock();
|
||||
|
||||
if (attr == &veth_active_attr) {
|
||||
if (value && !pool->active) {
|
||||
if (netif_running(netdev)) {
|
||||
if (ibmveth_alloc_buffer_pool(pool)) {
|
||||
netdev_err(netdev,
|
||||
"unable to alloc pool\n");
|
||||
return -ENOMEM;
|
||||
rc = -ENOMEM;
|
||||
goto unlock_err;
|
||||
}
|
||||
pool->active = 1;
|
||||
ibmveth_close(netdev);
|
||||
if ((rc = ibmveth_open(netdev)))
|
||||
return rc;
|
||||
rc = ibmveth_open(netdev);
|
||||
if (rc)
|
||||
goto unlock_err;
|
||||
} else {
|
||||
pool->active = 1;
|
||||
}
|
||||
@@ -1833,48 +1837,59 @@ static ssize_t veth_pool_store(struct kobject *kobj, struct attribute *attr,
|
||||
|
||||
if (i == IBMVETH_NUM_BUFF_POOLS) {
|
||||
netdev_err(netdev, "no active pool >= MTU\n");
|
||||
return -EPERM;
|
||||
rc = -EPERM;
|
||||
goto unlock_err;
|
||||
}
|
||||
|
||||
if (netif_running(netdev)) {
|
||||
ibmveth_close(netdev);
|
||||
pool->active = 0;
|
||||
if ((rc = ibmveth_open(netdev)))
|
||||
return rc;
|
||||
rc = ibmveth_open(netdev);
|
||||
if (rc)
|
||||
goto unlock_err;
|
||||
}
|
||||
pool->active = 0;
|
||||
}
|
||||
} else if (attr == &veth_num_attr) {
|
||||
if (value <= 0 || value > IBMVETH_MAX_POOL_COUNT) {
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto unlock_err;
|
||||
} else {
|
||||
if (netif_running(netdev)) {
|
||||
ibmveth_close(netdev);
|
||||
pool->size = value;
|
||||
if ((rc = ibmveth_open(netdev)))
|
||||
return rc;
|
||||
rc = ibmveth_open(netdev);
|
||||
if (rc)
|
||||
goto unlock_err;
|
||||
} else {
|
||||
pool->size = value;
|
||||
}
|
||||
}
|
||||
} else if (attr == &veth_size_attr) {
|
||||
if (value <= IBMVETH_BUFF_OH || value > IBMVETH_MAX_BUF_SIZE) {
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto unlock_err;
|
||||
} else {
|
||||
if (netif_running(netdev)) {
|
||||
ibmveth_close(netdev);
|
||||
pool->buff_size = value;
|
||||
if ((rc = ibmveth_open(netdev)))
|
||||
return rc;
|
||||
rc = ibmveth_open(netdev);
|
||||
if (rc)
|
||||
goto unlock_err;
|
||||
} else {
|
||||
pool->buff_size = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
rtnl_unlock();
|
||||
|
||||
/* kick the interrupt handler to allocate/deallocate pools */
|
||||
ibmveth_interrupt(netdev->irq, netdev);
|
||||
return count;
|
||||
|
||||
unlock_err:
|
||||
rtnl_unlock();
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -87,7 +87,11 @@ destroy_wqs:
|
||||
*/
|
||||
static void idpf_shutdown(struct pci_dev *pdev)
|
||||
{
|
||||
idpf_remove(pdev);
|
||||
struct idpf_adapter *adapter = pci_get_drvdata(pdev);
|
||||
|
||||
cancel_delayed_work_sync(&adapter->vc_event_task);
|
||||
idpf_vc_core_deinit(adapter);
|
||||
idpf_deinit_dflt_mbx(adapter);
|
||||
|
||||
if (system_state == SYSTEM_POWER_OFF)
|
||||
pci_set_power_state(pdev, PCI_D3hot);
|
||||
|
||||
@@ -1108,6 +1108,9 @@ struct mvpp2 {
|
||||
|
||||
/* Spinlocks for CM3 shared memory configuration */
|
||||
spinlock_t mss_spinlock;
|
||||
|
||||
/* Spinlock for shared PRS parser memory and shadow table */
|
||||
spinlock_t prs_spinlock;
|
||||
};
|
||||
|
||||
struct mvpp2_pcpu_stats {
|
||||
|
||||
@@ -7640,8 +7640,9 @@ static int mvpp2_probe(struct platform_device *pdev)
|
||||
if (mvpp2_read(priv, MVPP2_VER_ID_REG) == MVPP2_VER_PP23)
|
||||
priv->hw_version = MVPP23;
|
||||
|
||||
/* Init mss lock */
|
||||
/* Init locks for shared packet processor resources */
|
||||
spin_lock_init(&priv->mss_spinlock);
|
||||
spin_lock_init(&priv->prs_spinlock);
|
||||
|
||||
/* Initialize network controller */
|
||||
err = mvpp2_init(pdev, priv);
|
||||
|
||||
@@ -23,6 +23,8 @@ static int mvpp2_prs_hw_write(struct mvpp2 *priv, struct mvpp2_prs_entry *pe)
|
||||
{
|
||||
int i;
|
||||
|
||||
lockdep_assert_held(&priv->prs_spinlock);
|
||||
|
||||
if (pe->index > MVPP2_PRS_TCAM_SRAM_SIZE - 1)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -43,11 +45,13 @@ static int mvpp2_prs_hw_write(struct mvpp2 *priv, struct mvpp2_prs_entry *pe)
|
||||
}
|
||||
|
||||
/* Initialize tcam entry from hw */
|
||||
int mvpp2_prs_init_from_hw(struct mvpp2 *priv, struct mvpp2_prs_entry *pe,
|
||||
int tid)
|
||||
static int __mvpp2_prs_init_from_hw(struct mvpp2 *priv,
|
||||
struct mvpp2_prs_entry *pe, int tid)
|
||||
{
|
||||
int i;
|
||||
|
||||
lockdep_assert_held(&priv->prs_spinlock);
|
||||
|
||||
if (tid > MVPP2_PRS_TCAM_SRAM_SIZE - 1)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -73,6 +77,18 @@ int mvpp2_prs_init_from_hw(struct mvpp2 *priv, struct mvpp2_prs_entry *pe,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mvpp2_prs_init_from_hw(struct mvpp2 *priv, struct mvpp2_prs_entry *pe,
|
||||
int tid)
|
||||
{
|
||||
int err;
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
err = __mvpp2_prs_init_from_hw(priv, pe, tid);
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Invalidate tcam hw entry */
|
||||
static void mvpp2_prs_hw_inv(struct mvpp2 *priv, int index)
|
||||
{
|
||||
@@ -374,7 +390,7 @@ static int mvpp2_prs_flow_find(struct mvpp2 *priv, int flow)
|
||||
priv->prs_shadow[tid].lu != MVPP2_PRS_LU_FLOWS)
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
bits = mvpp2_prs_sram_ai_get(&pe);
|
||||
|
||||
/* Sram store classification lookup ID in AI bits [5:0] */
|
||||
@@ -441,7 +457,7 @@ static void mvpp2_prs_mac_drop_all_set(struct mvpp2 *priv, int port, bool add)
|
||||
|
||||
if (priv->prs_shadow[MVPP2_PE_DROP_ALL].valid) {
|
||||
/* Entry exist - update port only */
|
||||
mvpp2_prs_init_from_hw(priv, &pe, MVPP2_PE_DROP_ALL);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, MVPP2_PE_DROP_ALL);
|
||||
} else {
|
||||
/* Entry doesn't exist - create new */
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
@@ -469,14 +485,17 @@ static void mvpp2_prs_mac_drop_all_set(struct mvpp2 *priv, int port, bool add)
|
||||
}
|
||||
|
||||
/* Set port to unicast or multicast promiscuous mode */
|
||||
void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
|
||||
enum mvpp2_prs_l2_cast l2_cast, bool add)
|
||||
static void __mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
|
||||
enum mvpp2_prs_l2_cast l2_cast,
|
||||
bool add)
|
||||
{
|
||||
struct mvpp2_prs_entry pe;
|
||||
unsigned char cast_match;
|
||||
unsigned int ri;
|
||||
int tid;
|
||||
|
||||
lockdep_assert_held(&priv->prs_spinlock);
|
||||
|
||||
if (l2_cast == MVPP2_PRS_L2_UNI_CAST) {
|
||||
cast_match = MVPP2_PRS_UCAST_VAL;
|
||||
tid = MVPP2_PE_MAC_UC_PROMISCUOUS;
|
||||
@@ -489,7 +508,7 @@ void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
|
||||
|
||||
/* promiscuous mode - Accept unknown unicast or multicast packets */
|
||||
if (priv->prs_shadow[tid].valid) {
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
} else {
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
|
||||
@@ -522,6 +541,14 @@ void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
}
|
||||
|
||||
void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
|
||||
enum mvpp2_prs_l2_cast l2_cast, bool add)
|
||||
{
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
__mvpp2_prs_mac_promisc_set(priv, port, l2_cast, add);
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
}
|
||||
|
||||
/* Set entry for dsa packets */
|
||||
static void mvpp2_prs_dsa_tag_set(struct mvpp2 *priv, int port, bool add,
|
||||
bool tagged, bool extend)
|
||||
@@ -539,7 +566,7 @@ static void mvpp2_prs_dsa_tag_set(struct mvpp2 *priv, int port, bool add,
|
||||
|
||||
if (priv->prs_shadow[tid].valid) {
|
||||
/* Entry exist - update port only */
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
} else {
|
||||
/* Entry doesn't exist - create new */
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
@@ -610,7 +637,7 @@ static void mvpp2_prs_dsa_tag_ethertype_set(struct mvpp2 *priv, int port,
|
||||
|
||||
if (priv->prs_shadow[tid].valid) {
|
||||
/* Entry exist - update port only */
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
} else {
|
||||
/* Entry doesn't exist - create new */
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
@@ -673,7 +700,7 @@ static int mvpp2_prs_vlan_find(struct mvpp2 *priv, unsigned short tpid, int ai)
|
||||
priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VLAN)
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
match = mvpp2_prs_tcam_data_cmp(&pe, 0, tpid);
|
||||
if (!match)
|
||||
continue;
|
||||
@@ -726,7 +753,7 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
||||
priv->prs_shadow[tid_aux].lu != MVPP2_PRS_LU_VLAN)
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid_aux);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid_aux);
|
||||
ri_bits = mvpp2_prs_sram_ri_get(&pe);
|
||||
if ((ri_bits & MVPP2_PRS_RI_VLAN_MASK) ==
|
||||
MVPP2_PRS_RI_VLAN_DOUBLE)
|
||||
@@ -760,7 +787,7 @@ static int mvpp2_prs_vlan_add(struct mvpp2 *priv, unsigned short tpid, int ai,
|
||||
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_VLAN);
|
||||
} else {
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
}
|
||||
/* Update ports' mask */
|
||||
mvpp2_prs_tcam_port_map_set(&pe, port_map);
|
||||
@@ -800,7 +827,7 @@ static int mvpp2_prs_double_vlan_find(struct mvpp2 *priv, unsigned short tpid1,
|
||||
priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VLAN)
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
|
||||
match = mvpp2_prs_tcam_data_cmp(&pe, 0, tpid1) &&
|
||||
mvpp2_prs_tcam_data_cmp(&pe, 4, tpid2);
|
||||
@@ -849,7 +876,7 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
||||
priv->prs_shadow[tid_aux].lu != MVPP2_PRS_LU_VLAN)
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid_aux);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid_aux);
|
||||
ri_bits = mvpp2_prs_sram_ri_get(&pe);
|
||||
ri_bits &= MVPP2_PRS_RI_VLAN_MASK;
|
||||
if (ri_bits == MVPP2_PRS_RI_VLAN_SINGLE ||
|
||||
@@ -880,7 +907,7 @@ static int mvpp2_prs_double_vlan_add(struct mvpp2 *priv, unsigned short tpid1,
|
||||
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_VLAN);
|
||||
} else {
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
}
|
||||
|
||||
/* Update ports' mask */
|
||||
@@ -1213,8 +1240,8 @@ static void mvpp2_prs_mac_init(struct mvpp2 *priv)
|
||||
/* Create dummy entries for drop all and promiscuous modes */
|
||||
mvpp2_prs_drop_fc(priv);
|
||||
mvpp2_prs_mac_drop_all_set(priv, 0, false);
|
||||
mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_UNI_CAST, false);
|
||||
mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_MULTI_CAST, false);
|
||||
__mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_UNI_CAST, false);
|
||||
__mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_MULTI_CAST, false);
|
||||
}
|
||||
|
||||
/* Set default entries for various types of dsa packets */
|
||||
@@ -1533,12 +1560,6 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
|
||||
struct mvpp2_prs_entry pe;
|
||||
int err;
|
||||
|
||||
priv->prs_double_vlans = devm_kcalloc(&pdev->dev, sizeof(bool),
|
||||
MVPP2_PRS_DBL_VLANS_MAX,
|
||||
GFP_KERNEL);
|
||||
if (!priv->prs_double_vlans)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Double VLAN: 0x88A8, 0x8100 */
|
||||
err = mvpp2_prs_double_vlan_add(priv, ETH_P_8021AD, ETH_P_8021Q,
|
||||
MVPP2_PRS_PORT_MASK);
|
||||
@@ -1941,7 +1962,7 @@ static int mvpp2_prs_vid_range_find(struct mvpp2_port *port, u16 vid, u16 mask)
|
||||
port->priv->prs_shadow[tid].lu != MVPP2_PRS_LU_VID)
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(port->priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(port->priv, &pe, tid);
|
||||
|
||||
mvpp2_prs_tcam_data_byte_get(&pe, 2, &byte[0], &enable[0]);
|
||||
mvpp2_prs_tcam_data_byte_get(&pe, 3, &byte[1], &enable[1]);
|
||||
@@ -1970,6 +1991,8 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
/* Scan TCAM and see if entry with this <vid,port> already exist */
|
||||
tid = mvpp2_prs_vid_range_find(port, vid, mask);
|
||||
|
||||
@@ -1988,8 +2011,10 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
|
||||
MVPP2_PRS_VLAN_FILT_MAX_ENTRY);
|
||||
|
||||
/* There isn't room for a new VID filter */
|
||||
if (tid < 0)
|
||||
if (tid < 0) {
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
return tid;
|
||||
}
|
||||
|
||||
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_VID);
|
||||
pe.index = tid;
|
||||
@@ -1997,7 +2022,7 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
|
||||
/* Mask all ports */
|
||||
mvpp2_prs_tcam_port_map_set(&pe, 0);
|
||||
} else {
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
}
|
||||
|
||||
/* Enable the current port */
|
||||
@@ -2019,6 +2044,7 @@ int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid)
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_VID);
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2028,15 +2054,16 @@ void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid)
|
||||
struct mvpp2 *priv = port->priv;
|
||||
int tid;
|
||||
|
||||
/* Scan TCAM and see if entry with this <vid,port> already exist */
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
/* Invalidate TCAM entry with this <vid,port>, if it exists */
|
||||
tid = mvpp2_prs_vid_range_find(port, vid, 0xfff);
|
||||
if (tid >= 0) {
|
||||
mvpp2_prs_hw_inv(priv, tid);
|
||||
priv->prs_shadow[tid].valid = false;
|
||||
}
|
||||
|
||||
/* No such entry */
|
||||
if (tid < 0)
|
||||
return;
|
||||
|
||||
mvpp2_prs_hw_inv(priv, tid);
|
||||
priv->prs_shadow[tid].valid = false;
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
}
|
||||
|
||||
/* Remove all existing VID filters on this port */
|
||||
@@ -2045,6 +2072,8 @@ void mvpp2_prs_vid_remove_all(struct mvpp2_port *port)
|
||||
struct mvpp2 *priv = port->priv;
|
||||
int tid;
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
for (tid = MVPP2_PRS_VID_PORT_FIRST(port->id);
|
||||
tid <= MVPP2_PRS_VID_PORT_LAST(port->id); tid++) {
|
||||
if (priv->prs_shadow[tid].valid) {
|
||||
@@ -2052,6 +2081,8 @@ void mvpp2_prs_vid_remove_all(struct mvpp2_port *port)
|
||||
priv->prs_shadow[tid].valid = false;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
}
|
||||
|
||||
/* Remove VID filering entry for this port */
|
||||
@@ -2060,10 +2091,14 @@ void mvpp2_prs_vid_disable_filtering(struct mvpp2_port *port)
|
||||
unsigned int tid = MVPP2_PRS_VID_PORT_DFLT(port->id);
|
||||
struct mvpp2 *priv = port->priv;
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
/* Invalidate the guard entry */
|
||||
mvpp2_prs_hw_inv(priv, tid);
|
||||
|
||||
priv->prs_shadow[tid].valid = false;
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
}
|
||||
|
||||
/* Add guard entry that drops packets when no VID is matched on this port */
|
||||
@@ -2079,6 +2114,8 @@ void mvpp2_prs_vid_enable_filtering(struct mvpp2_port *port)
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
pe.index = tid;
|
||||
|
||||
reg_val = mvpp2_read(priv, MVPP2_MH_REG(port->id));
|
||||
@@ -2111,6 +2148,8 @@ void mvpp2_prs_vid_enable_filtering(struct mvpp2_port *port)
|
||||
/* Update shadow table */
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_VID);
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
}
|
||||
|
||||
/* Parser default initialization */
|
||||
@@ -2118,6 +2157,20 @@ int mvpp2_prs_default_init(struct platform_device *pdev, struct mvpp2 *priv)
|
||||
{
|
||||
int err, index, i;
|
||||
|
||||
priv->prs_shadow = devm_kcalloc(&pdev->dev, MVPP2_PRS_TCAM_SRAM_SIZE,
|
||||
sizeof(*priv->prs_shadow),
|
||||
GFP_KERNEL);
|
||||
if (!priv->prs_shadow)
|
||||
return -ENOMEM;
|
||||
|
||||
priv->prs_double_vlans = devm_kcalloc(&pdev->dev, sizeof(bool),
|
||||
MVPP2_PRS_DBL_VLANS_MAX,
|
||||
GFP_KERNEL);
|
||||
if (!priv->prs_double_vlans)
|
||||
return -ENOMEM;
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
/* Enable tcam table */
|
||||
mvpp2_write(priv, MVPP2_PRS_TCAM_CTRL_REG, MVPP2_PRS_TCAM_EN_MASK);
|
||||
|
||||
@@ -2136,12 +2189,6 @@ int mvpp2_prs_default_init(struct platform_device *pdev, struct mvpp2 *priv)
|
||||
for (index = 0; index < MVPP2_PRS_TCAM_SRAM_SIZE; index++)
|
||||
mvpp2_prs_hw_inv(priv, index);
|
||||
|
||||
priv->prs_shadow = devm_kcalloc(&pdev->dev, MVPP2_PRS_TCAM_SRAM_SIZE,
|
||||
sizeof(*priv->prs_shadow),
|
||||
GFP_KERNEL);
|
||||
if (!priv->prs_shadow)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Always start from lookup = 0 */
|
||||
for (index = 0; index < MVPP2_MAX_PORTS; index++)
|
||||
mvpp2_prs_hw_port_init(priv, index, MVPP2_PRS_LU_MH,
|
||||
@@ -2158,26 +2205,13 @@ int mvpp2_prs_default_init(struct platform_device *pdev, struct mvpp2 *priv)
|
||||
mvpp2_prs_vid_init(priv);
|
||||
|
||||
err = mvpp2_prs_etype_init(priv);
|
||||
if (err)
|
||||
return err;
|
||||
err = err ? : mvpp2_prs_vlan_init(pdev, priv);
|
||||
err = err ? : mvpp2_prs_pppoe_init(priv);
|
||||
err = err ? : mvpp2_prs_ip6_init(priv);
|
||||
err = err ? : mvpp2_prs_ip4_init(priv);
|
||||
|
||||
err = mvpp2_prs_vlan_init(pdev, priv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mvpp2_prs_pppoe_init(priv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mvpp2_prs_ip6_init(priv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mvpp2_prs_ip4_init(priv);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return 0;
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Compare MAC DA with tcam entry data */
|
||||
@@ -2217,7 +2251,7 @@ mvpp2_prs_mac_da_range_find(struct mvpp2 *priv, int pmap, const u8 *da,
|
||||
(priv->prs_shadow[tid].udf != udf_type))
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
entry_pmap = mvpp2_prs_tcam_port_map_get(&pe);
|
||||
|
||||
if (mvpp2_prs_mac_range_equals(&pe, da, mask) &&
|
||||
@@ -2229,7 +2263,8 @@ mvpp2_prs_mac_da_range_find(struct mvpp2 *priv, int pmap, const u8 *da,
|
||||
}
|
||||
|
||||
/* Update parser's mac da entry */
|
||||
int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add)
|
||||
static int __mvpp2_prs_mac_da_accept(struct mvpp2_port *port,
|
||||
const u8 *da, bool add)
|
||||
{
|
||||
unsigned char mask[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
|
||||
struct mvpp2 *priv = port->priv;
|
||||
@@ -2261,7 +2296,7 @@ int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add)
|
||||
/* Mask all ports */
|
||||
mvpp2_prs_tcam_port_map_set(&pe, 0);
|
||||
} else {
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
}
|
||||
|
||||
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
|
||||
@@ -2317,6 +2352,17 @@ int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add)
|
||||
{
|
||||
int err;
|
||||
|
||||
spin_lock_bh(&port->priv->prs_spinlock);
|
||||
err = __mvpp2_prs_mac_da_accept(port, da, add);
|
||||
spin_unlock_bh(&port->priv->prs_spinlock);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int mvpp2_prs_update_mac_da(struct net_device *dev, const u8 *da)
|
||||
{
|
||||
struct mvpp2_port *port = netdev_priv(dev);
|
||||
@@ -2345,6 +2391,8 @@ void mvpp2_prs_mac_del_all(struct mvpp2_port *port)
|
||||
unsigned long pmap;
|
||||
int index, tid;
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
for (tid = MVPP2_PE_MAC_RANGE_START;
|
||||
tid <= MVPP2_PE_MAC_RANGE_END; tid++) {
|
||||
unsigned char da[ETH_ALEN], da_mask[ETH_ALEN];
|
||||
@@ -2354,7 +2402,7 @@ void mvpp2_prs_mac_del_all(struct mvpp2_port *port)
|
||||
(priv->prs_shadow[tid].udf != MVPP2_PRS_UDF_MAC_DEF))
|
||||
continue;
|
||||
|
||||
mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(priv, &pe, tid);
|
||||
|
||||
pmap = mvpp2_prs_tcam_port_map_get(&pe);
|
||||
|
||||
@@ -2375,14 +2423,17 @@ void mvpp2_prs_mac_del_all(struct mvpp2_port *port)
|
||||
continue;
|
||||
|
||||
/* Remove entry from TCAM */
|
||||
mvpp2_prs_mac_da_accept(port, da, false);
|
||||
__mvpp2_prs_mac_da_accept(port, da, false);
|
||||
}
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
}
|
||||
|
||||
int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type)
|
||||
{
|
||||
switch (type) {
|
||||
case MVPP2_TAG_TYPE_EDSA:
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
/* Add port to EDSA entries */
|
||||
mvpp2_prs_dsa_tag_set(priv, port, true,
|
||||
MVPP2_PRS_TAGGED, MVPP2_PRS_EDSA);
|
||||
@@ -2393,9 +2444,11 @@ int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type)
|
||||
MVPP2_PRS_TAGGED, MVPP2_PRS_DSA);
|
||||
mvpp2_prs_dsa_tag_set(priv, port, false,
|
||||
MVPP2_PRS_UNTAGGED, MVPP2_PRS_DSA);
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
break;
|
||||
|
||||
case MVPP2_TAG_TYPE_DSA:
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
/* Add port to DSA entries */
|
||||
mvpp2_prs_dsa_tag_set(priv, port, true,
|
||||
MVPP2_PRS_TAGGED, MVPP2_PRS_DSA);
|
||||
@@ -2406,10 +2459,12 @@ int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type)
|
||||
MVPP2_PRS_TAGGED, MVPP2_PRS_EDSA);
|
||||
mvpp2_prs_dsa_tag_set(priv, port, false,
|
||||
MVPP2_PRS_UNTAGGED, MVPP2_PRS_EDSA);
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
break;
|
||||
|
||||
case MVPP2_TAG_TYPE_MH:
|
||||
case MVPP2_TAG_TYPE_NONE:
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
/* Remove port form EDSA and DSA entries */
|
||||
mvpp2_prs_dsa_tag_set(priv, port, false,
|
||||
MVPP2_PRS_TAGGED, MVPP2_PRS_DSA);
|
||||
@@ -2419,6 +2474,7 @@ int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type)
|
||||
MVPP2_PRS_TAGGED, MVPP2_PRS_EDSA);
|
||||
mvpp2_prs_dsa_tag_set(priv, port, false,
|
||||
MVPP2_PRS_UNTAGGED, MVPP2_PRS_EDSA);
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -2437,11 +2493,15 @@ int mvpp2_prs_add_flow(struct mvpp2 *priv, int flow, u32 ri, u32 ri_mask)
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
tid = mvpp2_prs_tcam_first_free(priv,
|
||||
MVPP2_PE_LAST_FREE_TID,
|
||||
MVPP2_PE_FIRST_FREE_TID);
|
||||
if (tid < 0)
|
||||
if (tid < 0) {
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
return tid;
|
||||
}
|
||||
|
||||
pe.index = tid;
|
||||
|
||||
@@ -2461,6 +2521,7 @@ int mvpp2_prs_add_flow(struct mvpp2 *priv, int flow, u32 ri, u32 ri_mask)
|
||||
mvpp2_prs_tcam_port_map_set(&pe, MVPP2_PRS_PORT_MASK);
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2472,6 +2533,8 @@ int mvpp2_prs_def_flow(struct mvpp2_port *port)
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
|
||||
spin_lock_bh(&port->priv->prs_spinlock);
|
||||
|
||||
tid = mvpp2_prs_flow_find(port->priv, port->id);
|
||||
|
||||
/* Such entry not exist */
|
||||
@@ -2480,8 +2543,10 @@ int mvpp2_prs_def_flow(struct mvpp2_port *port)
|
||||
tid = mvpp2_prs_tcam_first_free(port->priv,
|
||||
MVPP2_PE_LAST_FREE_TID,
|
||||
MVPP2_PE_FIRST_FREE_TID);
|
||||
if (tid < 0)
|
||||
if (tid < 0) {
|
||||
spin_unlock_bh(&port->priv->prs_spinlock);
|
||||
return tid;
|
||||
}
|
||||
|
||||
pe.index = tid;
|
||||
|
||||
@@ -2492,13 +2557,14 @@ int mvpp2_prs_def_flow(struct mvpp2_port *port)
|
||||
/* Update shadow table */
|
||||
mvpp2_prs_shadow_set(port->priv, pe.index, MVPP2_PRS_LU_FLOWS);
|
||||
} else {
|
||||
mvpp2_prs_init_from_hw(port->priv, &pe, tid);
|
||||
__mvpp2_prs_init_from_hw(port->priv, &pe, tid);
|
||||
}
|
||||
|
||||
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
|
||||
mvpp2_prs_tcam_port_map_set(&pe, (1 << port->id));
|
||||
mvpp2_prs_hw_write(port->priv, &pe);
|
||||
|
||||
spin_unlock_bh(&port->priv->prs_spinlock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2509,11 +2575,14 @@ int mvpp2_prs_hits(struct mvpp2 *priv, int index)
|
||||
if (index > MVPP2_PRS_TCAM_SRAM_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_bh(&priv->prs_spinlock);
|
||||
|
||||
mvpp2_write(priv, MVPP2_PRS_TCAM_HIT_IDX_REG, index);
|
||||
|
||||
val = mvpp2_read(priv, MVPP2_PRS_TCAM_HIT_CNT_REG);
|
||||
|
||||
val &= MVPP2_PRS_TCAM_HIT_CNT_MASK;
|
||||
|
||||
spin_unlock_bh(&priv->prs_spinlock);
|
||||
return val;
|
||||
}
|
||||
|
||||
@@ -689,6 +689,20 @@ struct trace_event_file {
|
||||
atomic_t tm_ref; /* trigger-mode reference counter */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HIST_TRIGGERS
|
||||
extern struct irq_work hist_poll_work;
|
||||
extern wait_queue_head_t hist_poll_wq;
|
||||
|
||||
static inline void hist_poll_wakeup(void)
|
||||
{
|
||||
if (wq_has_sleeper(&hist_poll_wq))
|
||||
irq_work_queue(&hist_poll_work);
|
||||
}
|
||||
|
||||
#define hist_poll_wait(file, wait) \
|
||||
poll_wait(file, &hist_poll_wq, wait)
|
||||
#endif
|
||||
|
||||
#define __TRACE_EVENT_FLAGS(name, value) \
|
||||
static int __init trace_init_flags_##name(void) \
|
||||
{ \
|
||||
|
||||
@@ -2407,6 +2407,7 @@ ctx_time_update_event(struct perf_event_context *ctx, struct perf_event *event)
|
||||
#define DETACH_GROUP 0x01UL
|
||||
#define DETACH_CHILD 0x02UL
|
||||
#define DETACH_DEAD 0x04UL
|
||||
#define DETACH_EXIT 0x08UL
|
||||
|
||||
/*
|
||||
* Cross CPU call to remove a performance event
|
||||
@@ -2421,6 +2422,7 @@ __perf_remove_from_context(struct perf_event *event,
|
||||
void *info)
|
||||
{
|
||||
struct perf_event_pmu_context *pmu_ctx = event->pmu_ctx;
|
||||
enum perf_event_state state = PERF_EVENT_STATE_OFF;
|
||||
unsigned long flags = (unsigned long)info;
|
||||
|
||||
ctx_time_update(cpuctx, ctx);
|
||||
@@ -2429,16 +2431,19 @@ __perf_remove_from_context(struct perf_event *event,
|
||||
* Ensure event_sched_out() switches to OFF, at the very least
|
||||
* this avoids raising perf_pending_task() at this time.
|
||||
*/
|
||||
if (flags & DETACH_DEAD)
|
||||
if (flags & DETACH_EXIT)
|
||||
state = PERF_EVENT_STATE_EXIT;
|
||||
if (flags & DETACH_DEAD) {
|
||||
event->pending_disable = 1;
|
||||
state = PERF_EVENT_STATE_DEAD;
|
||||
}
|
||||
event_sched_out(event, ctx);
|
||||
perf_event_set_state(event, min(event->state, state));
|
||||
if (flags & DETACH_GROUP)
|
||||
perf_group_detach(event);
|
||||
if (flags & DETACH_CHILD)
|
||||
perf_child_detach(event);
|
||||
list_del_event(event, ctx);
|
||||
if (flags & DETACH_DEAD)
|
||||
event->state = PERF_EVENT_STATE_DEAD;
|
||||
|
||||
if (!pmu_ctx->nr_events) {
|
||||
pmu_ctx->rotate_necessary = 0;
|
||||
@@ -13329,12 +13334,7 @@ perf_event_exit_event(struct perf_event *event, struct perf_event_context *ctx)
|
||||
mutex_lock(&parent_event->child_mutex);
|
||||
}
|
||||
|
||||
perf_remove_from_context(event, detach_flags);
|
||||
|
||||
raw_spin_lock_irq(&ctx->lock);
|
||||
if (event->state > PERF_EVENT_STATE_EXIT)
|
||||
perf_event_set_state(event, PERF_EVENT_STATE_EXIT);
|
||||
raw_spin_unlock_irq(&ctx->lock);
|
||||
perf_remove_from_context(event, detach_flags | DETACH_EXIT);
|
||||
|
||||
/*
|
||||
* Child events can be freed.
|
||||
|
||||
@@ -3111,6 +3111,20 @@ static bool event_in_systems(struct trace_event_call *call,
|
||||
return !*p || isspace(*p) || *p == ',';
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HIST_TRIGGERS
|
||||
/*
|
||||
* Wake up waiter on the hist_poll_wq from irq_work because the hist trigger
|
||||
* may happen in any context.
|
||||
*/
|
||||
static void hist_poll_event_irq_work(struct irq_work *work)
|
||||
{
|
||||
wake_up_all(&hist_poll_wq);
|
||||
}
|
||||
|
||||
DEFINE_IRQ_WORK(hist_poll_work, hist_poll_event_irq_work);
|
||||
DECLARE_WAIT_QUEUE_HEAD(hist_poll_wq);
|
||||
#endif
|
||||
|
||||
static struct trace_event_file *
|
||||
trace_create_new_event(struct trace_event_call *call,
|
||||
struct trace_array *tr)
|
||||
|
||||
@@ -5314,6 +5314,8 @@ static void event_hist_trigger(struct event_trigger_data *data,
|
||||
|
||||
if (resolve_var_refs(hist_data, key, var_ref_vals, true))
|
||||
hist_trigger_actions(hist_data, elt, buffer, rec, rbe, key, var_ref_vals);
|
||||
|
||||
hist_poll_wakeup();
|
||||
}
|
||||
|
||||
static void hist_trigger_stacktrace_print(struct seq_file *m,
|
||||
@@ -5593,49 +5595,137 @@ static void hist_trigger_show(struct seq_file *m,
|
||||
n_entries, (u64)atomic64_read(&hist_data->map->drops));
|
||||
}
|
||||
|
||||
struct hist_file_data {
|
||||
struct file *file;
|
||||
u64 last_read;
|
||||
u64 last_act;
|
||||
};
|
||||
|
||||
static u64 get_hist_hit_count(struct trace_event_file *event_file)
|
||||
{
|
||||
struct hist_trigger_data *hist_data;
|
||||
struct event_trigger_data *data;
|
||||
u64 ret = 0;
|
||||
|
||||
list_for_each_entry(data, &event_file->triggers, list) {
|
||||
if (data->cmd_ops->trigger_type == ETT_EVENT_HIST) {
|
||||
hist_data = data->private_data;
|
||||
ret += atomic64_read(&hist_data->map->hits);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int hist_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct hist_file_data *hist_file = m->private;
|
||||
struct event_trigger_data *data;
|
||||
struct trace_event_file *event_file;
|
||||
int n = 0, ret = 0;
|
||||
int n = 0;
|
||||
|
||||
mutex_lock(&event_mutex);
|
||||
guard(mutex)(&event_mutex);
|
||||
|
||||
event_file = event_file_file(m->private);
|
||||
if (unlikely(!event_file)) {
|
||||
ret = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
event_file = event_file_file(hist_file->file);
|
||||
if (unlikely(!event_file))
|
||||
return -ENODEV;
|
||||
|
||||
list_for_each_entry(data, &event_file->triggers, list) {
|
||||
if (data->cmd_ops->trigger_type == ETT_EVENT_HIST)
|
||||
hist_trigger_show(m, data, n++);
|
||||
}
|
||||
hist_file->last_read = get_hist_hit_count(event_file);
|
||||
/*
|
||||
* Update last_act too so that poll()/POLLPRI can wait for the next
|
||||
* event after any syscall on hist file.
|
||||
*/
|
||||
hist_file->last_act = hist_file->last_read;
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&event_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static __poll_t event_hist_poll(struct file *file, struct poll_table_struct *wait)
|
||||
{
|
||||
struct trace_event_file *event_file;
|
||||
struct seq_file *m = file->private_data;
|
||||
struct hist_file_data *hist_file = m->private;
|
||||
__poll_t ret = 0;
|
||||
u64 cnt;
|
||||
|
||||
guard(mutex)(&event_mutex);
|
||||
|
||||
event_file = event_file_data(file);
|
||||
if (!event_file)
|
||||
return EPOLLERR;
|
||||
|
||||
hist_poll_wait(file, wait);
|
||||
|
||||
cnt = get_hist_hit_count(event_file);
|
||||
if (hist_file->last_read != cnt)
|
||||
ret |= EPOLLIN | EPOLLRDNORM;
|
||||
if (hist_file->last_act != cnt) {
|
||||
hist_file->last_act = cnt;
|
||||
ret |= EPOLLPRI;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int event_hist_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct hist_file_data *hist_file = m->private;
|
||||
|
||||
kfree(hist_file);
|
||||
return tracing_single_release_file_tr(inode, file);
|
||||
}
|
||||
|
||||
static int event_hist_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct trace_event_file *event_file;
|
||||
struct hist_file_data *hist_file;
|
||||
int ret;
|
||||
|
||||
ret = tracing_open_file_tr(inode, file);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
guard(mutex)(&event_mutex);
|
||||
|
||||
event_file = event_file_data(file);
|
||||
if (!event_file) {
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
hist_file = kzalloc(sizeof(*hist_file), GFP_KERNEL);
|
||||
if (!hist_file) {
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
}
|
||||
|
||||
hist_file->file = file;
|
||||
hist_file->last_act = get_hist_hit_count(event_file);
|
||||
|
||||
/* Clear private_data to avoid warning in single_open() */
|
||||
file->private_data = NULL;
|
||||
return single_open(file, hist_show, file);
|
||||
ret = single_open(file, hist_show, hist_file);
|
||||
if (ret) {
|
||||
kfree(hist_file);
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err:
|
||||
tracing_release_file_tr(inode, file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct file_operations event_hist_fops = {
|
||||
.open = event_hist_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = tracing_single_release_file_tr,
|
||||
.release = event_hist_release,
|
||||
.poll = event_hist_poll,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HIST_TRIGGERS_DEBUG
|
||||
@@ -5876,25 +5966,19 @@ static int hist_debug_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct event_trigger_data *data;
|
||||
struct trace_event_file *event_file;
|
||||
int n = 0, ret = 0;
|
||||
int n = 0;
|
||||
|
||||
mutex_lock(&event_mutex);
|
||||
guard(mutex)(&event_mutex);
|
||||
|
||||
event_file = event_file_file(m->private);
|
||||
if (unlikely(!event_file)) {
|
||||
ret = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
if (unlikely(!event_file))
|
||||
return -ENODEV;
|
||||
|
||||
list_for_each_entry(data, &event_file->triggers, list) {
|
||||
if (data->cmd_ops->trigger_type == ETT_EVENT_HIST)
|
||||
hist_trigger_debug_show(m, data, n++);
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&event_mutex);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int event_hist_debug_open(struct inode *inode, struct file *file)
|
||||
@@ -5907,7 +5991,10 @@ static int event_hist_debug_open(struct inode *inode, struct file *file)
|
||||
|
||||
/* Clear private_data to avoid warning in single_open() */
|
||||
file->private_data = NULL;
|
||||
return single_open(file, hist_debug_show, file);
|
||||
ret = single_open(file, hist_debug_show, file);
|
||||
if (ret)
|
||||
tracing_release_file_tr(inode, file);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const struct file_operations event_hist_debug_fops = {
|
||||
|
||||
@@ -165,6 +165,14 @@ static void dst_count_dec(struct dst_entry *dst)
|
||||
void dst_release(struct dst_entry *dst)
|
||||
{
|
||||
if (dst && rcuref_put(&dst->__rcuref)) {
|
||||
#ifdef CONFIG_DST_CACHE
|
||||
if (dst->flags & DST_METADATA) {
|
||||
struct metadata_dst *md_dst = (struct metadata_dst *)dst;
|
||||
|
||||
if (md_dst->type == METADATA_IP_TUNNEL)
|
||||
dst_cache_reset_now(&md_dst->u.tun_info.dst_cache);
|
||||
}
|
||||
#endif
|
||||
dst_count_dec(dst);
|
||||
call_rcu_hurry(&dst->rcu_head, dst_destroy_rcu);
|
||||
}
|
||||
|
||||
@@ -416,7 +416,7 @@ int skb_tunnel_check_pmtu(struct sk_buff *skb, struct dst_entry *encap_dst,
|
||||
|
||||
skb_dst_update_pmtu_no_confirm(skb, mtu);
|
||||
|
||||
if (!reply || skb->pkt_type == PACKET_HOST)
|
||||
if (!reply)
|
||||
return 0;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IP))
|
||||
@@ -451,7 +451,7 @@ static const struct nla_policy
|
||||
geneve_opt_policy[LWTUNNEL_IP_OPT_GENEVE_MAX + 1] = {
|
||||
[LWTUNNEL_IP_OPT_GENEVE_CLASS] = { .type = NLA_U16 },
|
||||
[LWTUNNEL_IP_OPT_GENEVE_TYPE] = { .type = NLA_U8 },
|
||||
[LWTUNNEL_IP_OPT_GENEVE_DATA] = { .type = NLA_BINARY, .len = 128 },
|
||||
[LWTUNNEL_IP_OPT_GENEVE_DATA] = { .type = NLA_BINARY, .len = 127 },
|
||||
};
|
||||
|
||||
static const struct nla_policy
|
||||
|
||||
+24
-18
@@ -1477,12 +1477,12 @@ static bool udp_skb_has_head_state(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
/* fully reclaim rmem/fwd memory allocated for skb */
|
||||
static void udp_rmem_release(struct sock *sk, int size, int partial,
|
||||
bool rx_queue_lock_held)
|
||||
static void udp_rmem_release(struct sock *sk, unsigned int size,
|
||||
int partial, bool rx_queue_lock_held)
|
||||
{
|
||||
struct udp_sock *up = udp_sk(sk);
|
||||
struct sk_buff_head *sk_queue;
|
||||
int amt;
|
||||
unsigned int amt;
|
||||
|
||||
if (likely(partial)) {
|
||||
up->forward_deficit += size;
|
||||
@@ -1502,10 +1502,8 @@ static void udp_rmem_release(struct sock *sk, int size, int partial,
|
||||
if (!rx_queue_lock_held)
|
||||
spin_lock(&sk_queue->lock);
|
||||
|
||||
|
||||
sk_forward_alloc_add(sk, size);
|
||||
amt = (sk->sk_forward_alloc - partial) & ~(PAGE_SIZE - 1);
|
||||
sk_forward_alloc_add(sk, -amt);
|
||||
amt = (size + sk->sk_forward_alloc - partial) & ~(PAGE_SIZE - 1);
|
||||
sk_forward_alloc_add(sk, size - amt);
|
||||
|
||||
if (amt)
|
||||
__sk_mem_reduce_allocated(sk, amt >> PAGE_SHIFT);
|
||||
@@ -1577,19 +1575,27 @@ static int udp_rmem_schedule(struct sock *sk, int size)
|
||||
int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct sk_buff_head *list = &sk->sk_receive_queue;
|
||||
int rmem, err = -ENOMEM;
|
||||
unsigned int rmem, rcvbuf;
|
||||
spinlock_t *busy = NULL;
|
||||
int size, rcvbuf;
|
||||
int size, err = -ENOMEM;
|
||||
|
||||
trace_android_vh_udp_enqueue_schedule_skb(sk, skb);
|
||||
|
||||
/* Immediately drop when the receive queue is full.
|
||||
* Always allow at least one packet.
|
||||
*/
|
||||
rmem = atomic_read(&sk->sk_rmem_alloc);
|
||||
rcvbuf = READ_ONCE(sk->sk_rcvbuf);
|
||||
if (rmem > rcvbuf)
|
||||
goto drop;
|
||||
size = skb->truesize;
|
||||
|
||||
/* Immediately drop when the receive queue is full.
|
||||
* Cast to unsigned int performs the boundary check for INT_MAX.
|
||||
*/
|
||||
if (rmem + size > rcvbuf) {
|
||||
if (rcvbuf > INT_MAX >> 1)
|
||||
goto drop;
|
||||
|
||||
/* Always allow at least one packet for small buffer. */
|
||||
if (rmem > rcvbuf)
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* Under mem pressure, it might be helpful to help udp_recvmsg()
|
||||
* having linear skbs :
|
||||
@@ -1599,10 +1605,10 @@ int __udp_enqueue_schedule_skb(struct sock *sk, struct sk_buff *skb)
|
||||
*/
|
||||
if (rmem > (rcvbuf >> 1)) {
|
||||
skb_condense(skb);
|
||||
|
||||
size = skb->truesize;
|
||||
busy = busylock_acquire(sk);
|
||||
}
|
||||
size = skb->truesize;
|
||||
|
||||
udp_set_dev_scratch(skb);
|
||||
|
||||
atomic_add(size, &sk->sk_rmem_alloc);
|
||||
@@ -1689,7 +1695,7 @@ EXPORT_SYMBOL_GPL(skb_consume_udp);
|
||||
|
||||
static struct sk_buff *__first_packet_length(struct sock *sk,
|
||||
struct sk_buff_head *rcvq,
|
||||
int *total)
|
||||
unsigned int *total)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
@@ -1722,8 +1728,8 @@ static int first_packet_length(struct sock *sk)
|
||||
{
|
||||
struct sk_buff_head *rcvq = &udp_sk(sk)->reader_queue;
|
||||
struct sk_buff_head *sk_queue = &sk->sk_receive_queue;
|
||||
unsigned int total = 0;
|
||||
struct sk_buff *skb;
|
||||
int total = 0;
|
||||
int res;
|
||||
|
||||
spin_lock_bh(&rcvq->lock);
|
||||
|
||||
+25
-12
@@ -5829,6 +5829,27 @@ static void snmp6_fill_stats(u64 *stats, struct inet6_dev *idev, int attrtype,
|
||||
}
|
||||
}
|
||||
|
||||
static int inet6_fill_ifla6_stats_attrs(struct sk_buff *skb,
|
||||
struct inet6_dev *idev)
|
||||
{
|
||||
struct nlattr *nla;
|
||||
|
||||
nla = nla_reserve(skb, IFLA_INET6_STATS, IPSTATS_MIB_MAX * sizeof(u64));
|
||||
if (!nla)
|
||||
goto nla_put_failure;
|
||||
snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla));
|
||||
|
||||
nla = nla_reserve(skb, IFLA_INET6_ICMP6STATS, ICMP6_MIB_MAX * sizeof(u64));
|
||||
if (!nla)
|
||||
goto nla_put_failure;
|
||||
snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
|
||||
|
||||
return 0;
|
||||
|
||||
nla_put_failure:
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev,
|
||||
u32 ext_filter_mask)
|
||||
{
|
||||
@@ -5851,18 +5872,10 @@ static int inet6_fill_ifla6_attrs(struct sk_buff *skb, struct inet6_dev *idev,
|
||||
|
||||
/* XXX - MC not implemented */
|
||||
|
||||
if (ext_filter_mask & RTEXT_FILTER_SKIP_STATS)
|
||||
return 0;
|
||||
|
||||
nla = nla_reserve(skb, IFLA_INET6_STATS, IPSTATS_MIB_MAX * sizeof(u64));
|
||||
if (!nla)
|
||||
goto nla_put_failure;
|
||||
snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_STATS, nla_len(nla));
|
||||
|
||||
nla = nla_reserve(skb, IFLA_INET6_ICMP6STATS, ICMP6_MIB_MAX * sizeof(u64));
|
||||
if (!nla)
|
||||
goto nla_put_failure;
|
||||
snmp6_fill_stats(nla_data(nla), idev, IFLA_INET6_ICMP6STATS, nla_len(nla));
|
||||
if (!(ext_filter_mask & RTEXT_FILTER_SKIP_STATS)) {
|
||||
if (inet6_fill_ifla6_stats_attrs(skb, idev) < 0)
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
nla = nla_reserve(skb, IFLA_INET6_TOKEN, sizeof(struct in6_addr));
|
||||
if (!nla)
|
||||
|
||||
+18
-3
@@ -1072,8 +1072,13 @@ static int calipso_sock_getattr(struct sock *sk,
|
||||
struct ipv6_opt_hdr *hop;
|
||||
int opt_len, len, ret_val = -ENOMSG, offset;
|
||||
unsigned char *opt;
|
||||
struct ipv6_txoptions *txopts = txopt_get(inet6_sk(sk));
|
||||
struct ipv6_pinfo *pinfo = inet6_sk(sk);
|
||||
struct ipv6_txoptions *txopts;
|
||||
|
||||
if (!pinfo)
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
txopts = txopt_get(pinfo);
|
||||
if (!txopts || !txopts->hopopt)
|
||||
goto done;
|
||||
|
||||
@@ -1125,8 +1130,13 @@ static int calipso_sock_setattr(struct sock *sk,
|
||||
{
|
||||
int ret_val;
|
||||
struct ipv6_opt_hdr *old, *new;
|
||||
struct ipv6_txoptions *txopts = txopt_get(inet6_sk(sk));
|
||||
struct ipv6_pinfo *pinfo = inet6_sk(sk);
|
||||
struct ipv6_txoptions *txopts;
|
||||
|
||||
if (!pinfo)
|
||||
return -EAFNOSUPPORT;
|
||||
|
||||
txopts = txopt_get(pinfo);
|
||||
old = NULL;
|
||||
if (txopts)
|
||||
old = txopts->hopopt;
|
||||
@@ -1153,8 +1163,13 @@ static int calipso_sock_setattr(struct sock *sk,
|
||||
static void calipso_sock_delattr(struct sock *sk)
|
||||
{
|
||||
struct ipv6_opt_hdr *new_hop;
|
||||
struct ipv6_txoptions *txopts = txopt_get(inet6_sk(sk));
|
||||
struct ipv6_pinfo *pinfo = inet6_sk(sk);
|
||||
struct ipv6_txoptions *txopts;
|
||||
|
||||
if (!pinfo)
|
||||
return;
|
||||
|
||||
txopts = txopt_get(pinfo);
|
||||
if (!txopts || !txopts->hopopt)
|
||||
goto done;
|
||||
|
||||
|
||||
+38
-4
@@ -412,12 +412,37 @@ static bool rt6_check_expired(const struct rt6_info *rt)
|
||||
return false;
|
||||
}
|
||||
|
||||
static struct fib6_info *
|
||||
rt6_multipath_first_sibling_rcu(const struct fib6_info *rt)
|
||||
{
|
||||
struct fib6_info *iter;
|
||||
struct fib6_node *fn;
|
||||
|
||||
fn = rcu_dereference(rt->fib6_node);
|
||||
if (!fn)
|
||||
goto out;
|
||||
iter = rcu_dereference(fn->leaf);
|
||||
if (!iter)
|
||||
goto out;
|
||||
|
||||
while (iter) {
|
||||
if (iter->fib6_metric == rt->fib6_metric &&
|
||||
rt6_qualify_for_ecmp(iter))
|
||||
return iter;
|
||||
iter = rcu_dereference(iter->fib6_next);
|
||||
}
|
||||
|
||||
out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void fib6_select_path(const struct net *net, struct fib6_result *res,
|
||||
struct flowi6 *fl6, int oif, bool have_oif_match,
|
||||
const struct sk_buff *skb, int strict)
|
||||
{
|
||||
struct fib6_info *match = res->f6i;
|
||||
struct fib6_info *first, *match = res->f6i;
|
||||
struct fib6_info *sibling;
|
||||
int hash;
|
||||
|
||||
if (!match->nh && (!match->fib6_nsiblings || have_oif_match))
|
||||
goto out;
|
||||
@@ -440,16 +465,25 @@ void fib6_select_path(const struct net *net, struct fib6_result *res,
|
||||
return;
|
||||
}
|
||||
|
||||
if (fl6->mp_hash <= atomic_read(&match->fib6_nh->fib_nh_upper_bound))
|
||||
first = rt6_multipath_first_sibling_rcu(match);
|
||||
if (!first)
|
||||
goto out;
|
||||
|
||||
list_for_each_entry_rcu(sibling, &match->fib6_siblings,
|
||||
hash = fl6->mp_hash;
|
||||
if (hash <= atomic_read(&first->fib6_nh->fib_nh_upper_bound) &&
|
||||
rt6_score_route(first->fib6_nh, first->fib6_flags, oif,
|
||||
strict) >= 0) {
|
||||
match = first;
|
||||
goto out;
|
||||
}
|
||||
|
||||
list_for_each_entry_rcu(sibling, &first->fib6_siblings,
|
||||
fib6_siblings) {
|
||||
const struct fib6_nh *nh = sibling->fib6_nh;
|
||||
int nh_upper_bound;
|
||||
|
||||
nh_upper_bound = atomic_read(&nh->fib_nh_upper_bound);
|
||||
if (fl6->mp_hash > nh_upper_bound)
|
||||
if (hash > nh_upper_bound)
|
||||
continue;
|
||||
if (rt6_score_route(nh, sibling->fib6_flags, oif, strict) < 0)
|
||||
break;
|
||||
|
||||
@@ -2732,11 +2732,11 @@ static int nf_tables_updchain(struct nft_ctx *ctx, u8 genmask, u8 policy,
|
||||
err = nft_netdev_register_hooks(ctx->net, &hook.list);
|
||||
if (err < 0)
|
||||
goto err_hooks;
|
||||
|
||||
unregister = true;
|
||||
}
|
||||
}
|
||||
|
||||
unregister = true;
|
||||
|
||||
if (nla[NFTA_CHAIN_COUNTERS]) {
|
||||
if (!nft_is_base_chain(chain)) {
|
||||
err = -EOPNOTSUPP;
|
||||
|
||||
@@ -309,7 +309,8 @@ static bool nft_rhash_expr_needs_gc_run(const struct nft_set *set,
|
||||
|
||||
nft_setelem_expr_foreach(expr, elem_expr, size) {
|
||||
if (expr->ops->gc &&
|
||||
expr->ops->gc(read_pnet(&set->net), expr))
|
||||
expr->ops->gc(read_pnet(&set->net), expr) &&
|
||||
set->flags & NFT_SET_EVAL)
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -335,13 +335,13 @@ static int nft_tunnel_obj_erspan_init(const struct nlattr *attr,
|
||||
static const struct nla_policy nft_tunnel_opts_geneve_policy[NFTA_TUNNEL_KEY_GENEVE_MAX + 1] = {
|
||||
[NFTA_TUNNEL_KEY_GENEVE_CLASS] = { .type = NLA_U16 },
|
||||
[NFTA_TUNNEL_KEY_GENEVE_TYPE] = { .type = NLA_U8 },
|
||||
[NFTA_TUNNEL_KEY_GENEVE_DATA] = { .type = NLA_BINARY, .len = 128 },
|
||||
[NFTA_TUNNEL_KEY_GENEVE_DATA] = { .type = NLA_BINARY, .len = 127 },
|
||||
};
|
||||
|
||||
static int nft_tunnel_obj_geneve_init(const struct nlattr *attr,
|
||||
struct nft_tunnel_opts *opts)
|
||||
{
|
||||
struct geneve_opt *opt = (struct geneve_opt *)opts->u.data + opts->len;
|
||||
struct geneve_opt *opt = (struct geneve_opt *)(opts->u.data + opts->len);
|
||||
struct nlattr *tb[NFTA_TUNNEL_KEY_GENEVE_MAX + 1];
|
||||
int err, data_len;
|
||||
|
||||
@@ -628,7 +628,7 @@ static int nft_tunnel_opts_dump(struct sk_buff *skb,
|
||||
if (!inner)
|
||||
goto failure;
|
||||
while (opts->len > offset) {
|
||||
opt = (struct geneve_opt *)opts->u.data + offset;
|
||||
opt = (struct geneve_opt *)(opts->u.data + offset);
|
||||
if (nla_put_be16(skb, NFTA_TUNNEL_KEY_GENEVE_CLASS,
|
||||
opt->opt_class) ||
|
||||
nla_put_u8(skb, NFTA_TUNNEL_KEY_GENEVE_TYPE,
|
||||
|
||||
@@ -947,12 +947,6 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
|
||||
pskb_trim(skb, ovs_mac_header_len(key));
|
||||
}
|
||||
|
||||
/* Need to set the pkt_type to involve the routing layer. The
|
||||
* packet movement through the OVS datapath doesn't generally
|
||||
* use routing, but this is needed for tunnel cases.
|
||||
*/
|
||||
skb->pkt_type = PACKET_OUTGOING;
|
||||
|
||||
if (likely(!mru ||
|
||||
(skb->len <= mru + vport->dev->hard_header_len))) {
|
||||
ovs_vport_send(vport, skb, ovs_key_mac_proto(key));
|
||||
|
||||
@@ -68,7 +68,7 @@ geneve_opt_policy[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX + 1] = {
|
||||
[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_CLASS] = { .type = NLA_U16 },
|
||||
[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_TYPE] = { .type = NLA_U8 },
|
||||
[TCA_TUNNEL_KEY_ENC_OPT_GENEVE_DATA] = { .type = NLA_BINARY,
|
||||
.len = 128 },
|
||||
.len = 127 },
|
||||
};
|
||||
|
||||
static const struct nla_policy
|
||||
|
||||
@@ -766,7 +766,7 @@ geneve_opt_policy[TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX + 1] = {
|
||||
[TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS] = { .type = NLA_U16 },
|
||||
[TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE] = { .type = NLA_U8 },
|
||||
[TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA] = { .type = NLA_BINARY,
|
||||
.len = 128 },
|
||||
.len = 127 },
|
||||
};
|
||||
|
||||
static const struct nla_policy
|
||||
|
||||
@@ -123,8 +123,6 @@ static int skbprio_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
/* Check to update highest and lowest priorities. */
|
||||
if (skb_queue_empty(lp_qdisc)) {
|
||||
if (q->lowest_prio == q->highest_prio) {
|
||||
/* The incoming packet is the only packet in queue. */
|
||||
BUG_ON(sch->q.qlen != 1);
|
||||
q->lowest_prio = prio;
|
||||
q->highest_prio = prio;
|
||||
} else {
|
||||
@@ -156,7 +154,6 @@ static struct sk_buff *skbprio_dequeue(struct Qdisc *sch)
|
||||
/* Update highest priority field. */
|
||||
if (skb_queue_empty(hpq)) {
|
||||
if (q->lowest_prio == q->highest_prio) {
|
||||
BUG_ON(sch->q.qlen);
|
||||
q->highest_prio = 0;
|
||||
q->lowest_prio = SKBPRIO_MAX_PRIORITY - 1;
|
||||
} else {
|
||||
|
||||
@@ -525,6 +525,8 @@ static int proc_sctp_do_auth(const struct ctl_table *ctl, int write,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static DEFINE_MUTEX(sctp_sysctl_mutex);
|
||||
|
||||
static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write,
|
||||
void *buffer, size_t *lenp, loff_t *ppos)
|
||||
{
|
||||
@@ -549,6 +551,7 @@ static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write,
|
||||
if (new_value > max || new_value < min)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&sctp_sysctl_mutex);
|
||||
net->sctp.udp_port = new_value;
|
||||
sctp_udp_sock_stop(net);
|
||||
if (new_value) {
|
||||
@@ -561,6 +564,7 @@ static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write,
|
||||
lock_sock(sk);
|
||||
sctp_sk(sk)->udp_port = htons(net->sctp.udp_port);
|
||||
release_sock(sk);
|
||||
mutex_unlock(&sctp_sysctl_mutex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -1551,7 +1551,11 @@ static int vsock_connect(struct socket *sock, struct sockaddr *addr,
|
||||
timeout = vsk->connect_timeout;
|
||||
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
||||
|
||||
while (sk->sk_state != TCP_ESTABLISHED && sk->sk_err == 0) {
|
||||
/* If the socket is already closing or it is in an error state, there
|
||||
* is no point in waiting.
|
||||
*/
|
||||
while (sk->sk_state != TCP_ESTABLISHED &&
|
||||
sk->sk_state != TCP_CLOSING && sk->sk_err == 0) {
|
||||
if (flags & O_NONBLOCK) {
|
||||
/* If we're not going to block, we schedule a timeout
|
||||
* function to generate a timeout on the connection
|
||||
|
||||
@@ -21,9 +21,11 @@ ifeq ($(origin KBUILD_VERBOSE),undefined)
|
||||
endif
|
||||
endif
|
||||
|
||||
revision = $(lastword $(subst -, ,$(shell dpkg-parsechangelog -S Version)))
|
||||
revision = $(shell dpkg-parsechangelog -S Version | sed -n 's/.*-//p')
|
||||
CROSS_COMPILE ?= $(filter-out $(DEB_BUILD_GNU_TYPE)-, $(DEB_HOST_GNU_TYPE)-)
|
||||
make-opts = ARCH=$(ARCH) KERNELRELEASE=$(KERNELRELEASE) KBUILD_BUILD_VERSION=$(revision) $(addprefix CROSS_COMPILE=,$(CROSS_COMPILE))
|
||||
make-opts = ARCH=$(ARCH) KERNELRELEASE=$(KERNELRELEASE) \
|
||||
$(addprefix KBUILD_BUILD_VERSION=,$(revision)) \
|
||||
$(addprefix CROSS_COMPILE=,$(CROSS_COMPILE))
|
||||
|
||||
binary-targets := $(addprefix binary-, image image-dbg headers libc-dev)
|
||||
|
||||
|
||||
@@ -168,6 +168,8 @@ The system configuration dump (if --quiet is not used) is followed by statistics
|
||||
.PP
|
||||
\fBPkgTmp\fP Degrees Celsius reported by the per-package Package Thermal Monitor.
|
||||
.PP
|
||||
\fBCoreThr\fP Core Thermal Throttling events during the measurement interval. Note that events since boot can be find in /sys/devices/system/cpu/cpu*/thermal_throttle/*
|
||||
.PP
|
||||
\fBGFX%rc6\fP The percentage of time the GPU is in the "render C6" state, rc6, during the measurement interval. From /sys/class/drm/card0/power/rc6_residency_ms or /sys/class/drm/card0/gt/gt0/rc6_residency_ms or /sys/class/drm/card0/device/tile0/gtN/gtidle/idle_residency_ms depending on the graphics driver being used.
|
||||
.PP
|
||||
\fBGFXMHz\fP Instantaneous snapshot of what sysfs presents at the end of the measurement interval. From /sys/class/graphics/fb0/device/drm/card0/gt_cur_freq_mhz or /sys/class/drm/card0/gt_cur_freq_mhz or /sys/class/drm/card0/gt/gt0/rps_cur_freq_mhz or /sys/class/drm/card0/device/tile0/gtN/freq0/cur_freq depending on the graphics driver being used.
|
||||
|
||||
@@ -3242,7 +3242,7 @@ void delta_core(struct core_data *new, struct core_data *old)
|
||||
old->c6 = new->c6 - old->c6;
|
||||
old->c7 = new->c7 - old->c7;
|
||||
old->core_temp_c = new->core_temp_c;
|
||||
old->core_throt_cnt = new->core_throt_cnt;
|
||||
old->core_throt_cnt = new->core_throt_cnt - old->core_throt_cnt;
|
||||
old->mc6_us = new->mc6_us - old->mc6_us;
|
||||
|
||||
DELTA_WRAP32(new->core_energy.raw_value, old->core_energy.raw_value);
|
||||
|
||||
Reference in New Issue
Block a user