@@ -1585,33 +1585,45 @@ static int mlxsw_sp_setup_tc_block_cb_flower(enum tc_setup_type type,
15851585 }
15861586}
15871587
1588+ static void mlxsw_sp_tc_block_flower_release (void * cb_priv )
1589+ {
1590+ struct mlxsw_sp_acl_block * acl_block = cb_priv ;
1591+
1592+ mlxsw_sp_acl_block_destroy (acl_block );
1593+ }
1594+
1595+ static LIST_HEAD (mlxsw_sp_block_cb_list );
1596+
15881597static int
15891598mlxsw_sp_setup_tc_block_flower_bind (struct mlxsw_sp_port * mlxsw_sp_port ,
1590- struct tcf_block * block , bool ingress ,
1591- struct netlink_ext_ack * extack )
1599+ struct flow_block_offload * f , bool ingress )
15921600{
15931601 struct mlxsw_sp * mlxsw_sp = mlxsw_sp_port -> mlxsw_sp ;
15941602 struct mlxsw_sp_acl_block * acl_block ;
1595- struct tcf_block_cb * block_cb ;
1603+ struct flow_block_cb * block_cb ;
1604+ bool register_block = false;
15961605 int err ;
15971606
1598- block_cb = tcf_block_cb_lookup ( block , mlxsw_sp_setup_tc_block_cb_flower ,
1599- mlxsw_sp );
1607+ block_cb = flow_block_cb_lookup ( f , mlxsw_sp_setup_tc_block_cb_flower ,
1608+ mlxsw_sp );
16001609 if (!block_cb ) {
1601- acl_block = mlxsw_sp_acl_block_create (mlxsw_sp , block -> net );
1610+ acl_block = mlxsw_sp_acl_block_create (mlxsw_sp , f -> net );
16021611 if (!acl_block )
16031612 return - ENOMEM ;
1604- block_cb = __tcf_block_cb_register (block ,
1605- mlxsw_sp_setup_tc_block_cb_flower ,
1606- mlxsw_sp , acl_block , extack );
1613+ block_cb = flow_block_cb_alloc (f -> net ,
1614+ mlxsw_sp_setup_tc_block_cb_flower ,
1615+ mlxsw_sp , acl_block ,
1616+ mlxsw_sp_tc_block_flower_release );
16071617 if (IS_ERR (block_cb )) {
1618+ mlxsw_sp_acl_block_destroy (acl_block );
16081619 err = PTR_ERR (block_cb );
16091620 goto err_cb_register ;
16101621 }
1622+ register_block = true;
16111623 } else {
1612- acl_block = tcf_block_cb_priv (block_cb );
1624+ acl_block = flow_block_cb_priv (block_cb );
16131625 }
1614- tcf_block_cb_incref (block_cb );
1626+ flow_block_cb_incref (block_cb );
16151627 err = mlxsw_sp_acl_block_bind (mlxsw_sp , acl_block ,
16161628 mlxsw_sp_port , ingress );
16171629 if (err )
@@ -1622,28 +1634,31 @@ mlxsw_sp_setup_tc_block_flower_bind(struct mlxsw_sp_port *mlxsw_sp_port,
16221634 else
16231635 mlxsw_sp_port -> eg_acl_block = acl_block ;
16241636
1637+ if (register_block ) {
1638+ flow_block_cb_add (block_cb , f );
1639+ list_add_tail (& block_cb -> driver_list , & mlxsw_sp_block_cb_list );
1640+ }
1641+
16251642 return 0 ;
16261643
16271644err_block_bind :
1628- if (!tcf_block_cb_decref (block_cb )) {
1629- __tcf_block_cb_unregister ( block , block_cb );
1645+ if (!flow_block_cb_decref (block_cb ))
1646+ flow_block_cb_free ( block_cb );
16301647err_cb_register :
1631- mlxsw_sp_acl_block_destroy (acl_block );
1632- }
16331648 return err ;
16341649}
16351650
16361651static void
16371652mlxsw_sp_setup_tc_block_flower_unbind (struct mlxsw_sp_port * mlxsw_sp_port ,
1638- struct tcf_block * block , bool ingress )
1653+ struct flow_block_offload * f , bool ingress )
16391654{
16401655 struct mlxsw_sp * mlxsw_sp = mlxsw_sp_port -> mlxsw_sp ;
16411656 struct mlxsw_sp_acl_block * acl_block ;
1642- struct tcf_block_cb * block_cb ;
1657+ struct flow_block_cb * block_cb ;
16431658 int err ;
16441659
1645- block_cb = tcf_block_cb_lookup ( block , mlxsw_sp_setup_tc_block_cb_flower ,
1646- mlxsw_sp );
1660+ block_cb = flow_block_cb_lookup ( f , mlxsw_sp_setup_tc_block_cb_flower ,
1661+ mlxsw_sp );
16471662 if (!block_cb )
16481663 return ;
16491664
@@ -1652,18 +1667,19 @@ mlxsw_sp_setup_tc_block_flower_unbind(struct mlxsw_sp_port *mlxsw_sp_port,
16521667 else
16531668 mlxsw_sp_port -> eg_acl_block = NULL ;
16541669
1655- acl_block = tcf_block_cb_priv (block_cb );
1670+ acl_block = flow_block_cb_priv (block_cb );
16561671 err = mlxsw_sp_acl_block_unbind (mlxsw_sp , acl_block ,
16571672 mlxsw_sp_port , ingress );
1658- if (!err && !tcf_block_cb_decref (block_cb )) {
1659- __tcf_block_cb_unregister ( block , block_cb );
1660- mlxsw_sp_acl_block_destroy ( acl_block );
1673+ if (!err && !flow_block_cb_decref (block_cb )) {
1674+ flow_block_cb_remove ( block_cb , f );
1675+ list_del ( & block_cb -> driver_list );
16611676 }
16621677}
16631678
16641679static int mlxsw_sp_setup_tc_block (struct mlxsw_sp_port * mlxsw_sp_port ,
1665- struct tc_block_offload * f )
1680+ struct flow_block_offload * f )
16661681{
1682+ struct flow_block_cb * block_cb ;
16671683 tc_setup_cb_t * cb ;
16681684 bool ingress ;
16691685 int err ;
@@ -1678,24 +1694,32 @@ static int mlxsw_sp_setup_tc_block(struct mlxsw_sp_port *mlxsw_sp_port,
16781694 return - EOPNOTSUPP ;
16791695 }
16801696
1697+ f -> driver_block_list = & mlxsw_sp_block_cb_list ;
1698+
16811699 switch (f -> command ) {
16821700 case FLOW_BLOCK_BIND :
1683- err = tcf_block_cb_register (f -> block , cb , mlxsw_sp_port ,
1684- mlxsw_sp_port , f -> extack );
1685- if (err )
1686- return err ;
1687- err = mlxsw_sp_setup_tc_block_flower_bind (mlxsw_sp_port ,
1688- f -> block , ingress ,
1689- f -> extack );
1701+ block_cb = flow_block_cb_alloc (f -> net , cb , mlxsw_sp_port ,
1702+ mlxsw_sp_port , NULL );
1703+ if (IS_ERR (block_cb ))
1704+ return PTR_ERR (block_cb );
1705+ err = mlxsw_sp_setup_tc_block_flower_bind (mlxsw_sp_port , f ,
1706+ ingress );
16901707 if (err ) {
1691- tcf_block_cb_unregister ( f -> block , cb , mlxsw_sp_port );
1708+ flow_block_cb_free ( block_cb );
16921709 return err ;
16931710 }
1711+ flow_block_cb_add (block_cb , f );
1712+ list_add_tail (& block_cb -> driver_list , & mlxsw_sp_block_cb_list );
16941713 return 0 ;
16951714 case FLOW_BLOCK_UNBIND :
16961715 mlxsw_sp_setup_tc_block_flower_unbind (mlxsw_sp_port ,
1697- f -> block , ingress );
1698- tcf_block_cb_unregister (f -> block , cb , mlxsw_sp_port );
1716+ f , ingress );
1717+ block_cb = flow_block_cb_lookup (f , cb , mlxsw_sp_port );
1718+ if (!block_cb )
1719+ return - ENOENT ;
1720+
1721+ flow_block_cb_remove (block_cb , f );
1722+ list_del (& block_cb -> driver_list );
16991723 return 0 ;
17001724 default :
17011725 return - EOPNOTSUPP ;
0 commit comments