diff mbox series

[net-next,v5] net: psample: Introduce stubs to remove NIC driver dependency

Message ID 20210130023319.32560-1-cmi@nvidia.com (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series [net-next,v5] net: psample: Introduce stubs to remove NIC driver dependency | expand

Checks

Context Check Description
netdev/cover_letter success Link
netdev/fixes_present success Link
netdev/patch_count success Link
netdev/tree_selection success Clearly marked for net-next
netdev/subject_prefix success Link
netdev/cc_maintainers warning 5 maintainers not CCed: jhs@mojatatu.com yotam.gi@gmail.com jiri@resnulli.us davem@davemloft.net xiyou.wangcong@gmail.com
netdev/source_inline success Was 0 now: 0
netdev/verify_signedoff success Link
netdev/module_param success Was 0 now: 0
netdev/build_32bit fail Errors and warnings before: 527 this patch: 9
netdev/kdoc success Errors and warnings before: 1 this patch: 0
netdev/verify_fixes success Link
netdev/checkpatch warning WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
netdev/build_allmodconfig_warn fail Errors and warnings before: 527 this patch: 9
netdev/header_inline success Link
netdev/stable success Stable not CCed

Commit Message

Chris Mi Jan. 30, 2021, 2:33 a.m. UTC
In order to send sampled packets to userspace, NIC driver calls
psample api directly. But it creates a hard dependency on module
psample. Introduce psample_ops to remove the hard dependency.
It is initialized when psample module is loaded and set to NULL
when the module is unloaded.

Reported-by: kernel test robot <lkp@intel.com>
Signed-off-by: Chris Mi <cmi@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
---
v1->v2:
 - fix sparse errors
v2->v3:
 - remove inline
v3->v4:
 - add inline back
v4->v5:
 - address Jakub's comments

 include/net/psample.h    | 26 ++++++++++++++++++++++++++
 net/psample/psample.c    | 14 +++++++++++++-
 net/sched/Makefile       |  2 +-
 net/sched/psample_stub.c |  5 +++++
 4 files changed, 45 insertions(+), 2 deletions(-)
 create mode 100644 net/sched/psample_stub.c

Comments

Jakub Kicinski Jan. 30, 2021, 6:59 a.m. UTC | #1
On Sat, 30 Jan 2021 10:33:19 +0800 Chris Mi wrote:
> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> +/* Copyright (c) 2021 Mellanox Technologies. */
> +
> +const struct psample_ops __rcu *psample_ops __read_mostly;
> +EXPORT_SYMBOL_GPL(psample_ops);

Please explain to me how you could possibly have compile tested this
and not caught that it doesn't build.
Ido Schimmel Jan. 30, 2021, 2:52 p.m. UTC | #2
On Sat, Jan 30, 2021 at 10:33:19AM +0800, Chris Mi wrote:
> In order to send sampled packets to userspace, NIC driver calls
> psample api directly. But it creates a hard dependency on module
> psample. Introduce psample_ops to remove the hard dependency.
> It is initialized when psample module is loaded and set to NULL
> when the module is unloaded.
> 
> Reported-by: kernel test robot <lkp@intel.com>

This belongs in the changelog (that should be part of the commit
message). Something like "Fix xxx reported by kernel test robot".

> Signed-off-by: Chris Mi <cmi@nvidia.com>
> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
> ---
> v1->v2:
>  - fix sparse errors
> v2->v3:
>  - remove inline
> v3->v4:
>  - add inline back
> v4->v5:
>  - address Jakub's comments
> 
>  include/net/psample.h    | 26 ++++++++++++++++++++++++++
>  net/psample/psample.c    | 14 +++++++++++++-
>  net/sched/Makefile       |  2 +-
>  net/sched/psample_stub.c |  5 +++++
>  4 files changed, 45 insertions(+), 2 deletions(-)
>  create mode 100644 net/sched/psample_stub.c
> 
> diff --git a/include/net/psample.h b/include/net/psample.h
> index 68ae16bb0a4a..d0f1cfc56f6f 100644
> --- a/include/net/psample.h
> +++ b/include/net/psample.h
> @@ -14,6 +14,15 @@ struct psample_group {
>  	struct rcu_head rcu;
>  };
>  
> +struct psample_ops {
> +	void (*sample_packet)(struct psample_group *group, struct sk_buff *skb,
> +			      u32 trunc_size, int in_ifindex, int out_ifindex,
> +			      u32 sample_rate);
> +
> +};
> +
> +extern const struct psample_ops __rcu *psample_ops __read_mostly;
> +
>  struct psample_group *psample_group_get(struct net *net, u32 group_num);
>  void psample_group_take(struct psample_group *group);
>  void psample_group_put(struct psample_group *group);
> @@ -35,4 +44,21 @@ static inline void psample_sample_packet(struct psample_group *group,
>  
>  #endif
>  
> +static inline void
> +psample_nic_sample_packet(struct psample_group *group,
> +			  struct sk_buff *skb, u32 trunc_size,
> +			  int in_ifindex, int out_ifindex,
> +			  u32 sample_rate)
> +{
> +	const struct psample_ops *ops;
> +
> +	rcu_read_lock();
> +	ops = rcu_dereference(psample_ops);
> +	if (ops)
> +		ops->sample_packet(group, skb, trunc_size,
> +				   in_ifindex, out_ifindex,
> +				   sample_rate);
> +	rcu_read_unlock();
> +}
> +
>  #endif /* __NET_PSAMPLE_H */
> diff --git a/net/psample/psample.c b/net/psample/psample.c
> index 33e238c965bd..983ca5b698fe 100644
> --- a/net/psample/psample.c
> +++ b/net/psample/psample.c
> @@ -8,6 +8,7 @@
>  #include <linux/kernel.h>
>  #include <linux/skbuff.h>
>  #include <linux/module.h>
> +#include <linux/rcupdate.h>
>  #include <net/net_namespace.h>
>  #include <net/sock.h>
>  #include <net/netlink.h>
> @@ -35,6 +36,10 @@ static const struct genl_multicast_group psample_nl_mcgrps[] = {
>  
>  static struct genl_family psample_nl_family __ro_after_init;
>  
> +static const struct psample_ops psample_sample_ops = {
> +	.sample_packet	= psample_sample_packet,
> +};
> +
>  static int psample_group_nl_fill(struct sk_buff *msg,
>  				 struct psample_group *group,
>  				 enum psample_command cmd, u32 portid, u32 seq,
> @@ -456,11 +461,18 @@ EXPORT_SYMBOL_GPL(psample_sample_packet);
>  
>  static int __init psample_module_init(void)
>  {
> -	return genl_register_family(&psample_nl_family);
> +	int ret;
> +
> +	ret = genl_register_family(&psample_nl_family);
> +	if (!ret)
> +		RCU_INIT_POINTER(psample_ops, &psample_sample_ops);
> +	return ret;
>  }
>  
>  static void __exit psample_module_exit(void)
>  {
> +	rcu_assign_pointer(psample_ops, NULL);
> +	synchronize_rcu();
>  	genl_unregister_family(&psample_nl_family);
>  }
>  
> diff --git a/net/sched/Makefile b/net/sched/Makefile
> index dd14ef413fda..0d92bb98bb26 100644
> --- a/net/sched/Makefile
> +++ b/net/sched/Makefile
> @@ -3,7 +3,7 @@
>  # Makefile for the Linux Traffic Control Unit.
>  #
>  
> -obj-y	:= sch_generic.o sch_mq.o
> +obj-y	:= sch_generic.o sch_mq.o psample_stub.o

Why the stub is under net/sched/ when psample is at net/psample/?
psample is not the same as 'act_sample'.

>  
>  obj-$(CONFIG_INET)		+= sch_frag.o
>  obj-$(CONFIG_NET_SCHED)		+= sch_api.o sch_blackhole.o
> diff --git a/net/sched/psample_stub.c b/net/sched/psample_stub.c
> new file mode 100644
> index 000000000000..0541b8c5100d
> --- /dev/null
> +++ b/net/sched/psample_stub.c
> @@ -0,0 +1,5 @@
> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB

psample has "// SPDX-License-Identifier: GPL-2.0-only"

> +/* Copyright (c) 2021 Mellanox Technologies. */
> +
> +const struct psample_ops __rcu *psample_ops __read_mostly;
> +EXPORT_SYMBOL_GPL(psample_ops);
> -- 
> 2.26.2
>
Chris Mi Feb. 1, 2021, 1:32 a.m. UTC | #3
On 1/30/2021 2:59 PM, Jakub Kicinski wrote:
> On Sat, 30 Jan 2021 10:33:19 +0800 Chris Mi wrote:
>> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
>> +/* Copyright (c) 2021 Mellanox Technologies. */
>> +
>> +const struct psample_ops __rcu *psample_ops __read_mostly;
>> +EXPORT_SYMBOL_GPL(psample_ops);
> Please explain to me how you could possibly have compile tested this
> and not caught that it doesn't build.
Sorry, I don't understand which issue you are talking about. Do you mean
the issue sparse found before or new issues in v5?

Thanks.
Chris Mi Feb. 1, 2021, 2 a.m. UTC | #4
On 1/30/2021 10:52 PM, Ido Schimmel wrote:
> On Sat, Jan 30, 2021 at 10:33:19AM +0800, Chris Mi wrote:
>> In order to send sampled packets to userspace, NIC driver calls
>> psample api directly. But it creates a hard dependency on module
>> psample. Introduce psample_ops to remove the hard dependency.
>> It is initialized when psample module is loaded and set to NULL
>> when the module is unloaded.
>>
>> Reported-by: kernel test robot <lkp@intel.com>
> This belongs in the changelog (that should be part of the commit
> message). Something like "Fix xxx reported by kernel test robot".
But I see existing commits have it. And Jakub didn't ask me to do it. So 
I think
I'd better keep it.
>
>> Signed-off-by: Chris Mi <cmi@nvidia.com>
>> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
>> ---
>> v1->v2:
>>   - fix sparse errors
>> v2->v3:
>>   - remove inline
>> v3->v4:
>>   - add inline back
>> v4->v5:
>>   - address Jakub's comments
>>
>>   include/net/psample.h    | 26 ++++++++++++++++++++++++++
>>   net/psample/psample.c    | 14 +++++++++++++-
>>   net/sched/Makefile       |  2 +-
>>   net/sched/psample_stub.c |  5 +++++
>>   4 files changed, 45 insertions(+), 2 deletions(-)
>>   create mode 100644 net/sched/psample_stub.c
>>
>> diff --git a/include/net/psample.h b/include/net/psample.h
>> index 68ae16bb0a4a..d0f1cfc56f6f 100644
>> --- a/include/net/psample.h
>> +++ b/include/net/psample.h
>> @@ -14,6 +14,15 @@ struct psample_group {
>>   	struct rcu_head rcu;
>>   };
>>   
>> +struct psample_ops {
>> +	void (*sample_packet)(struct psample_group *group, struct sk_buff *skb,
>> +			      u32 trunc_size, int in_ifindex, int out_ifindex,
>> +			      u32 sample_rate);
>> +
>> +};
>> +
>> +extern const struct psample_ops __rcu *psample_ops __read_mostly;
>> +
>>   struct psample_group *psample_group_get(struct net *net, u32 group_num);
>>   void psample_group_take(struct psample_group *group);
>>   void psample_group_put(struct psample_group *group);
>> @@ -35,4 +44,21 @@ static inline void psample_sample_packet(struct psample_group *group,
>>   
>>   #endif
>>   
>> +static inline void
>> +psample_nic_sample_packet(struct psample_group *group,
>> +			  struct sk_buff *skb, u32 trunc_size,
>> +			  int in_ifindex, int out_ifindex,
>> +			  u32 sample_rate)
>> +{
>> +	const struct psample_ops *ops;
>> +
>> +	rcu_read_lock();
>> +	ops = rcu_dereference(psample_ops);
>> +	if (ops)
>> +		ops->sample_packet(group, skb, trunc_size,
>> +				   in_ifindex, out_ifindex,
>> +				   sample_rate);
>> +	rcu_read_unlock();
>> +}
>> +
>>   #endif /* __NET_PSAMPLE_H */
>> diff --git a/net/psample/psample.c b/net/psample/psample.c
>> index 33e238c965bd..983ca5b698fe 100644
>> --- a/net/psample/psample.c
>> +++ b/net/psample/psample.c
>> @@ -8,6 +8,7 @@
>>   #include <linux/kernel.h>
>>   #include <linux/skbuff.h>
>>   #include <linux/module.h>
>> +#include <linux/rcupdate.h>
>>   #include <net/net_namespace.h>
>>   #include <net/sock.h>
>>   #include <net/netlink.h>
>> @@ -35,6 +36,10 @@ static const struct genl_multicast_group psample_nl_mcgrps[] = {
>>   
>>   static struct genl_family psample_nl_family __ro_after_init;
>>   
>> +static const struct psample_ops psample_sample_ops = {
>> +	.sample_packet	= psample_sample_packet,
>> +};
>> +
>>   static int psample_group_nl_fill(struct sk_buff *msg,
>>   				 struct psample_group *group,
>>   				 enum psample_command cmd, u32 portid, u32 seq,
>> @@ -456,11 +461,18 @@ EXPORT_SYMBOL_GPL(psample_sample_packet);
>>   
>>   static int __init psample_module_init(void)
>>   {
>> -	return genl_register_family(&psample_nl_family);
>> +	int ret;
>> +
>> +	ret = genl_register_family(&psample_nl_family);
>> +	if (!ret)
>> +		RCU_INIT_POINTER(psample_ops, &psample_sample_ops);
>> +	return ret;
>>   }
>>   
>>   static void __exit psample_module_exit(void)
>>   {
>> +	rcu_assign_pointer(psample_ops, NULL);
>> +	synchronize_rcu();
>>   	genl_unregister_family(&psample_nl_family);
>>   }
>>   
>> diff --git a/net/sched/Makefile b/net/sched/Makefile
>> index dd14ef413fda..0d92bb98bb26 100644
>> --- a/net/sched/Makefile
>> +++ b/net/sched/Makefile
>> @@ -3,7 +3,7 @@
>>   # Makefile for the Linux Traffic Control Unit.
>>   #
>>   
>> -obj-y	:= sch_generic.o sch_mq.o
>> +obj-y	:= sch_generic.o sch_mq.o psample_stub.o
> Why the stub is under net/sched/ when psample is at net/psample/?
> psample is not the same as 'act_sample'.
If this stub is in net/psample and compiled to psample kernel module, NIC
driver still depends on it. It must be in kernel. And I think net/sched 
is the
only place we can put. If we put it in somewhere else, like net/, I 
guess we'll
get more objections.
>
>>   
>>   obj-$(CONFIG_INET)		+= sch_frag.o
>>   obj-$(CONFIG_NET_SCHED)		+= sch_api.o sch_blackhole.o
>> diff --git a/net/sched/psample_stub.c b/net/sched/psample_stub.c
>> new file mode 100644
>> index 000000000000..0541b8c5100d
>> --- /dev/null
>> +++ b/net/sched/psample_stub.c
>> @@ -0,0 +1,5 @@
>> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> psample has "// SPDX-License-Identifier: GPL-2.0-only"
Done. Thanks.
>
>> +/* Copyright (c) 2021 Mellanox Technologies. */
>> +
>> +const struct psample_ops __rcu *psample_ops __read_mostly;
>> +EXPORT_SYMBOL_GPL(psample_ops);
>> -- 
>> 2.26.2
>>
Ido Schimmel Feb. 1, 2021, 6:06 p.m. UTC | #5
On Mon, Feb 01, 2021 at 10:00:48AM +0800, Chris Mi wrote:
> On 1/30/2021 10:52 PM, Ido Schimmel wrote:
> > On Sat, Jan 30, 2021 at 10:33:19AM +0800, Chris Mi wrote:
> > > In order to send sampled packets to userspace, NIC driver calls
> > > psample api directly. But it creates a hard dependency on module
> > > psample. Introduce psample_ops to remove the hard dependency.
> > > It is initialized when psample module is loaded and set to NULL
> > > when the module is unloaded.
> > > 
> > > Reported-by: kernel test robot <lkp@intel.com>
> > This belongs in the changelog (that should be part of the commit
> > message). Something like "Fix xxx reported by kernel test robot".
> But I see existing commits have it.

It is used by commits whose sole purpose is to fix an issue that was
reported by the kernel test robot. In this case the robot merely
reported an issue with your v1. If you want to give credit, use the form
I suggested above. It is misleading otherwise.
Jakub Kicinski Feb. 1, 2021, 9:10 p.m. UTC | #6
On Mon, 1 Feb 2021 09:32:15 +0800 Chris Mi wrote:
> On 1/30/2021 2:59 PM, Jakub Kicinski wrote:
> > On Sat, 30 Jan 2021 10:33:19 +0800 Chris Mi wrote:  
> >> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
> >> +/* Copyright (c) 2021 Mellanox Technologies. */
> >> +
> >> +const struct psample_ops __rcu *psample_ops __read_mostly;
> >> +EXPORT_SYMBOL_GPL(psample_ops);  
> > Please explain to me how you could possibly have compile tested this
> > and not caught that it doesn't build.  
> Sorry, I don't understand which issue you are talking about. Do you mean
> the issue sparse found before or new issues in v5?

There is no include here now, and it uses EXPORT_SYMBOL_GPL() 
and a bunch of decorators.
Jakub Kicinski Feb. 2, 2021, 12:08 a.m. UTC | #7
On Mon, 1 Feb 2021 20:06:06 +0200 Ido Schimmel wrote:
> On Mon, Feb 01, 2021 at 10:00:48AM +0800, Chris Mi wrote:
> > On 1/30/2021 10:52 PM, Ido Schimmel wrote:  
> > > This belongs in the changelog (that should be part of the commit
> > > message). Something like "Fix xxx reported by kernel test robot".  
> > But I see existing commits have it.  
> 
> It is used by commits whose sole purpose is to fix an issue that was
> reported by the kernel test robot. In this case the robot merely
> reported an issue with your v1. If you want to give credit, use the form
> I suggested above. It is misleading otherwise.

Personally I fully agree. But some people pushed back on this in 
the past saying buildbot should be credited for early detection, 
too - otherwise the funding may dry up. So I don't care either 
way now :)
Chris Mi Feb. 2, 2021, 1:42 a.m. UTC | #8
On 2/2/2021 5:10 AM, Jakub Kicinski wrote:
> On Mon, 1 Feb 2021 09:32:15 +0800 Chris Mi wrote:
>> On 1/30/2021 2:59 PM, Jakub Kicinski wrote:
>>> On Sat, 30 Jan 2021 10:33:19 +0800 Chris Mi wrote:
>>>> +// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
>>>> +/* Copyright (c) 2021 Mellanox Technologies. */
>>>> +
>>>> +const struct psample_ops __rcu *psample_ops __read_mostly;
>>>> +EXPORT_SYMBOL_GPL(psample_ops);
>>> Please explain to me how you could possibly have compile tested this
>>> and not caught that it doesn't build.
>> Sorry, I don't understand which issue you are talking about. Do you mean
>> the issue sparse found before or new issues in v5?
> There is no include here now, and it uses EXPORT_SYMBOL_GPL()
> and a bunch of decorators.
>
But there is no errors in 'checks' section of this page:
https://patchwork.kernel.org/project/netdevbpf/patch/20210128014543.521151-1-cmi@nvidia.com/

And I followed kernel test robot guide, I reproduced the errors in v1, 
but I fixed it in v2.

reproduce:

         wgethttps://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross  -O ~/bin/make.cross
         chmod +x ~/bin/make.cross
         # apt-get install sparse
         # sparse version: v0.6.3-212-g56dbccf5-dirty
         #https://github.com/0day-ci/linux/commit/f2df98afc1a1f1809d9e8a178b2d4766cbca8bf7
         git remote add linux-reviewhttps://github.com/0day-ci/linux
         git fetch --no-tags linux-review Chris-Mi/net-psample-Introduce-stubs-to-remove-NIC-driver-dependency/20210127-082451
         git checkout f2df98afc1a1f1809d9e8a178b2d4766cbca8bf7
         # save the attached .config to linux build tree
         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=s390

I didn't see errors even if there is no include.
diff mbox series

Patch

diff --git a/include/net/psample.h b/include/net/psample.h
index 68ae16bb0a4a..d0f1cfc56f6f 100644
--- a/include/net/psample.h
+++ b/include/net/psample.h
@@ -14,6 +14,15 @@  struct psample_group {
 	struct rcu_head rcu;
 };
 
+struct psample_ops {
+	void (*sample_packet)(struct psample_group *group, struct sk_buff *skb,
+			      u32 trunc_size, int in_ifindex, int out_ifindex,
+			      u32 sample_rate);
+
+};
+
+extern const struct psample_ops __rcu *psample_ops __read_mostly;
+
 struct psample_group *psample_group_get(struct net *net, u32 group_num);
 void psample_group_take(struct psample_group *group);
 void psample_group_put(struct psample_group *group);
@@ -35,4 +44,21 @@  static inline void psample_sample_packet(struct psample_group *group,
 
 #endif
 
+static inline void
+psample_nic_sample_packet(struct psample_group *group,
+			  struct sk_buff *skb, u32 trunc_size,
+			  int in_ifindex, int out_ifindex,
+			  u32 sample_rate)
+{
+	const struct psample_ops *ops;
+
+	rcu_read_lock();
+	ops = rcu_dereference(psample_ops);
+	if (ops)
+		ops->sample_packet(group, skb, trunc_size,
+				   in_ifindex, out_ifindex,
+				   sample_rate);
+	rcu_read_unlock();
+}
+
 #endif /* __NET_PSAMPLE_H */
diff --git a/net/psample/psample.c b/net/psample/psample.c
index 33e238c965bd..983ca5b698fe 100644
--- a/net/psample/psample.c
+++ b/net/psample/psample.c
@@ -8,6 +8,7 @@ 
 #include <linux/kernel.h>
 #include <linux/skbuff.h>
 #include <linux/module.h>
+#include <linux/rcupdate.h>
 #include <net/net_namespace.h>
 #include <net/sock.h>
 #include <net/netlink.h>
@@ -35,6 +36,10 @@  static const struct genl_multicast_group psample_nl_mcgrps[] = {
 
 static struct genl_family psample_nl_family __ro_after_init;
 
+static const struct psample_ops psample_sample_ops = {
+	.sample_packet	= psample_sample_packet,
+};
+
 static int psample_group_nl_fill(struct sk_buff *msg,
 				 struct psample_group *group,
 				 enum psample_command cmd, u32 portid, u32 seq,
@@ -456,11 +461,18 @@  EXPORT_SYMBOL_GPL(psample_sample_packet);
 
 static int __init psample_module_init(void)
 {
-	return genl_register_family(&psample_nl_family);
+	int ret;
+
+	ret = genl_register_family(&psample_nl_family);
+	if (!ret)
+		RCU_INIT_POINTER(psample_ops, &psample_sample_ops);
+	return ret;
 }
 
 static void __exit psample_module_exit(void)
 {
+	rcu_assign_pointer(psample_ops, NULL);
+	synchronize_rcu();
 	genl_unregister_family(&psample_nl_family);
 }
 
diff --git a/net/sched/Makefile b/net/sched/Makefile
index dd14ef413fda..0d92bb98bb26 100644
--- a/net/sched/Makefile
+++ b/net/sched/Makefile
@@ -3,7 +3,7 @@ 
 # Makefile for the Linux Traffic Control Unit.
 #
 
-obj-y	:= sch_generic.o sch_mq.o
+obj-y	:= sch_generic.o sch_mq.o psample_stub.o
 
 obj-$(CONFIG_INET)		+= sch_frag.o
 obj-$(CONFIG_NET_SCHED)		+= sch_api.o sch_blackhole.o
diff --git a/net/sched/psample_stub.c b/net/sched/psample_stub.c
new file mode 100644
index 000000000000..0541b8c5100d
--- /dev/null
+++ b/net/sched/psample_stub.c
@@ -0,0 +1,5 @@ 
+// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
+/* Copyright (c) 2021 Mellanox Technologies. */
+
+const struct psample_ops __rcu *psample_ops __read_mostly;
+EXPORT_SYMBOL_GPL(psample_ops);