8
8
#include <linux/kernel.h>
9
9
#include <linux/list.h>
10
10
#include <linux/mutex.h>
11
- #include <linux/rtnetlink.h>
12
11
#include <linux/slab.h>
13
12
#include <linux/sysfs.h>
14
13
@@ -24,39 +23,6 @@ static struct nsim_bus_dev *to_nsim_bus_dev(struct device *dev)
24
23
return container_of (dev , struct nsim_bus_dev , dev );
25
24
}
26
25
27
- static int nsim_bus_dev_vfs_enable (struct nsim_bus_dev * nsim_bus_dev ,
28
- unsigned int num_vfs )
29
- {
30
- struct nsim_dev * nsim_dev ;
31
- int err = 0 ;
32
-
33
- if (nsim_bus_dev -> max_vfs < num_vfs )
34
- return - ENOMEM ;
35
-
36
- if (!nsim_bus_dev -> vfconfigs )
37
- return - ENOMEM ;
38
- nsim_bus_dev -> num_vfs = num_vfs ;
39
-
40
- nsim_dev = dev_get_drvdata (& nsim_bus_dev -> dev );
41
- if (nsim_esw_mode_is_switchdev (nsim_dev )) {
42
- err = nsim_esw_switchdev_enable (nsim_dev , NULL );
43
- if (err )
44
- nsim_bus_dev -> num_vfs = 0 ;
45
- }
46
-
47
- return err ;
48
- }
49
-
50
- void nsim_bus_dev_vfs_disable (struct nsim_bus_dev * nsim_bus_dev )
51
- {
52
- struct nsim_dev * nsim_dev ;
53
-
54
- nsim_bus_dev -> num_vfs = 0 ;
55
- nsim_dev = dev_get_drvdata (& nsim_bus_dev -> dev );
56
- if (nsim_esw_mode_is_switchdev (nsim_dev ))
57
- nsim_esw_legacy_enable (nsim_dev , NULL );
58
- }
59
-
60
26
static ssize_t
61
27
nsim_bus_dev_numvfs_store (struct device * dev , struct device_attribute * attr ,
62
28
const char * buf , size_t count )
@@ -69,27 +35,13 @@ nsim_bus_dev_numvfs_store(struct device *dev, struct device_attribute *attr,
69
35
if (ret )
70
36
return ret ;
71
37
72
- mutex_lock (& nsim_bus_dev -> vfs_lock );
73
- if (nsim_bus_dev -> num_vfs == num_vfs )
74
- goto exit_good ;
75
- if (nsim_bus_dev -> num_vfs && num_vfs ) {
76
- ret = - EBUSY ;
77
- goto exit_unlock ;
78
- }
79
-
80
- if (num_vfs ) {
81
- ret = nsim_bus_dev_vfs_enable (nsim_bus_dev , num_vfs );
82
- if (ret )
83
- goto exit_unlock ;
84
- } else {
85
- nsim_bus_dev_vfs_disable (nsim_bus_dev );
86
- }
87
- exit_good :
88
- ret = count ;
89
- exit_unlock :
90
- mutex_unlock (& nsim_bus_dev -> vfs_lock );
38
+ device_lock (dev );
39
+ ret = - ENOENT ;
40
+ if (dev_get_drvdata (dev ))
41
+ ret = nsim_drv_configure_vfs (nsim_bus_dev , num_vfs );
42
+ device_unlock (dev );
91
43
92
- return ret ;
44
+ return ret ? ret : count ;
93
45
}
94
46
95
47
static ssize_t
@@ -105,79 +57,6 @@ static struct device_attribute nsim_bus_dev_numvfs_attr =
105
57
__ATTR (sriov_numvfs , 0664 , nsim_bus_dev_numvfs_show ,
106
58
nsim_bus_dev_numvfs_store );
107
59
108
- ssize_t nsim_bus_dev_max_vfs_read (struct file * file ,
109
- char __user * data ,
110
- size_t count , loff_t * ppos )
111
- {
112
- struct nsim_bus_dev * nsim_bus_dev = file -> private_data ;
113
- char buf [11 ];
114
- ssize_t len ;
115
-
116
- len = snprintf (buf , sizeof (buf ), "%u\n" , nsim_bus_dev -> max_vfs );
117
- if (len < 0 )
118
- return len ;
119
-
120
- return simple_read_from_buffer (data , count , ppos , buf , len );
121
- }
122
-
123
- ssize_t nsim_bus_dev_max_vfs_write (struct file * file ,
124
- const char __user * data ,
125
- size_t count , loff_t * ppos )
126
- {
127
- struct nsim_bus_dev * nsim_bus_dev = file -> private_data ;
128
- struct nsim_vf_config * vfconfigs ;
129
- ssize_t ret ;
130
- char buf [10 ];
131
- u32 val ;
132
-
133
- if (* ppos != 0 )
134
- return 0 ;
135
-
136
- if (count >= sizeof (buf ))
137
- return - ENOSPC ;
138
-
139
- mutex_lock (& nsim_bus_dev -> vfs_lock );
140
- /* Reject if VFs are configured */
141
- if (nsim_bus_dev -> num_vfs ) {
142
- ret = - EBUSY ;
143
- goto unlock ;
144
- }
145
-
146
- ret = copy_from_user (buf , data , count );
147
- if (ret ) {
148
- ret = - EFAULT ;
149
- goto unlock ;
150
- }
151
-
152
- buf [count ] = '\0' ;
153
- ret = kstrtouint (buf , 10 , & val );
154
- if (ret ) {
155
- ret = - EIO ;
156
- goto unlock ;
157
- }
158
-
159
- /* max_vfs limited by the maximum number of provided port indexes */
160
- if (val > NSIM_DEV_VF_PORT_INDEX_MAX - NSIM_DEV_VF_PORT_INDEX_BASE ) {
161
- ret = - ERANGE ;
162
- goto unlock ;
163
- }
164
-
165
- vfconfigs = kcalloc (val , sizeof (struct nsim_vf_config ), GFP_KERNEL | __GFP_NOWARN );
166
- if (!vfconfigs ) {
167
- ret = - ENOMEM ;
168
- goto unlock ;
169
- }
170
-
171
- kfree (nsim_bus_dev -> vfconfigs );
172
- nsim_bus_dev -> vfconfigs = vfconfigs ;
173
- nsim_bus_dev -> max_vfs = val ;
174
- * ppos += count ;
175
- ret = count ;
176
- unlock :
177
- mutex_unlock (& nsim_bus_dev -> vfs_lock );
178
- return ret ;
179
- }
180
-
181
60
static ssize_t
182
61
new_port_store (struct device * dev , struct device_attribute * attr ,
183
62
const char * buf , size_t count )
@@ -201,7 +80,7 @@ new_port_store(struct device *dev, struct device_attribute *attr,
201
80
return - EBUSY ;
202
81
}
203
82
204
- ret = nsim_dev_port_add (nsim_bus_dev , NSIM_DEV_PORT_TYPE_PF , port_index );
83
+ ret = nsim_drv_port_add (nsim_bus_dev , NSIM_DEV_PORT_TYPE_PF , port_index );
205
84
mutex_unlock (& nsim_bus_dev -> nsim_bus_reload_lock );
206
85
return ret ? ret : count ;
207
86
}
@@ -231,7 +110,7 @@ del_port_store(struct device *dev, struct device_attribute *attr,
231
110
return - EBUSY ;
232
111
}
233
112
234
- ret = nsim_dev_port_del (nsim_bus_dev , NSIM_DEV_PORT_TYPE_PF , port_index );
113
+ ret = nsim_drv_port_del (nsim_bus_dev , NSIM_DEV_PORT_TYPE_PF , port_index );
235
114
mutex_unlock (& nsim_bus_dev -> nsim_bus_reload_lock );
236
115
return ret ? ret : count ;
237
116
}
@@ -371,14 +250,14 @@ static int nsim_bus_probe(struct device *dev)
371
250
{
372
251
struct nsim_bus_dev * nsim_bus_dev = to_nsim_bus_dev (dev );
373
252
374
- return nsim_dev_probe (nsim_bus_dev );
253
+ return nsim_drv_probe (nsim_bus_dev );
375
254
}
376
255
377
256
static void nsim_bus_remove (struct device * dev )
378
257
{
379
258
struct nsim_bus_dev * nsim_bus_dev = to_nsim_bus_dev (dev );
380
259
381
- nsim_dev_remove (nsim_bus_dev );
260
+ nsim_drv_remove (nsim_bus_dev );
382
261
}
383
262
384
263
static int nsim_num_vf (struct device * dev )
@@ -420,26 +299,15 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count, unsigned int num_queu
420
299
nsim_bus_dev -> initial_net = current -> nsproxy -> net_ns ;
421
300
nsim_bus_dev -> max_vfs = NSIM_BUS_DEV_MAX_VFS ;
422
301
mutex_init (& nsim_bus_dev -> nsim_bus_reload_lock );
423
- mutex_init (& nsim_bus_dev -> vfs_lock );
424
302
/* Disallow using nsim_bus_dev */
425
303
smp_store_release (& nsim_bus_dev -> init , false);
426
304
427
- nsim_bus_dev -> vfconfigs = kcalloc (nsim_bus_dev -> max_vfs ,
428
- sizeof (struct nsim_vf_config ),
429
- GFP_KERNEL | __GFP_NOWARN );
430
- if (!nsim_bus_dev -> vfconfigs ) {
431
- err = - ENOMEM ;
432
- goto err_nsim_bus_dev_id_free ;
433
- }
434
-
435
305
err = device_register (& nsim_bus_dev -> dev );
436
306
if (err )
437
- goto err_nsim_vfs_free ;
307
+ goto err_nsim_bus_dev_id_free ;
438
308
439
309
return nsim_bus_dev ;
440
310
441
- err_nsim_vfs_free :
442
- kfree (nsim_bus_dev -> vfconfigs );
443
311
err_nsim_bus_dev_id_free :
444
312
ida_free (& nsim_bus_dev_ids , nsim_bus_dev -> dev .id );
445
313
err_nsim_bus_dev_free :
@@ -453,7 +321,6 @@ static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev)
453
321
smp_store_release (& nsim_bus_dev -> init , false);
454
322
device_unregister (& nsim_bus_dev -> dev );
455
323
ida_free (& nsim_bus_dev_ids , nsim_bus_dev -> dev .id );
456
- kfree (nsim_bus_dev -> vfconfigs );
457
324
kfree (nsim_bus_dev );
458
325
}
459
326
0 commit comments