History

vfio/mdev: simplify mdev_type handling

Instead of abusing struct attribute_group to control initialization of struct mdev_type, just define the actual attributes in the mdev_driver, allocate the mdev_type structures in the caller and pass them to mdev_register_parent. This allows the caller to use container_of to get at the containing structure and thus significantly simplify the code.

Christoph Hellwig committed 4 years ago

Commit da44c341 parent 89345d517 files · +165 −326Browse files

Showing the changes to samples (3 of 17 files). Show all

Unified · Split

3 files
  1. samples/vfio-mdev/mbochs.c +23 −34
  2. samples/vfio-mdev/mdpy.c +19 −31
  3. samples/vfio-mdev/mtty.c +30 −30
samples/vfio-mdev/mbochs.c+23−34
@@ -99,23 +99,27 @@ MODULE_PARM_DESC(mem, "megabytes available to " MBOCHS_NAME " devices"); · 98 unmodified lines
9999 #define MBOCHS_TYPE_2 "medium"
100100 #define MBOCHS_TYPE_3 "large"
101101
102−static const struct mbochs_type {
102+static struct mbochs_type {
103+ struct mdev_type type;
103104 const char *name;
104105 u32 mbytes;
105106 u32 max_x;
106107 u32 max_y;
107108 } mbochs_types[] = {
108109 {
110+ .type.sysfs_name = MBOCHS_TYPE_1,
109111 .name = MBOCHS_CLASS_NAME "-" MBOCHS_TYPE_1,
110112 .mbytes = 4,
111113 .max_x = 800,
112114 .max_y = 600,
113115 }, {
116+ .type.sysfs_name = MBOCHS_TYPE_2,
114117 .name = MBOCHS_CLASS_NAME "-" MBOCHS_TYPE_2,
115118 .mbytes = 16,
116119 .max_x = 1920,
117120 .max_y = 1440,
118121 }, {
122+ .type.sysfs_name = MBOCHS_TYPE_3,
119123 .name = MBOCHS_CLASS_NAME "-" MBOCHS_TYPE_3,
120124 .mbytes = 64,
121125 .max_x = 0,
@@ -123,6 +127,11 @@ static const struct mbochs_type { · 1 unmodified line
123127 },
124128 };
125129
130+static struct mdev_type *mbochs_mdev_types[] = {
131+ &mbochs_types[0].type,
132+ &mbochs_types[1].type,
133+ &mbochs_types[2].type,
134+};
126135
127136 static dev_t mbochs_devt;
128137 static struct class *mbochs_class;
@@ -510,8 +519,8 @@ static int mbochs_init_dev(struct vfio_device *vdev) · 381 unmodified lines
510519 struct mdev_state *mdev_state =
511520 container_of(vdev, struct mdev_state, vdev);
512521 struct mdev_device *mdev = to_mdev_device(vdev->dev);
513− const struct mbochs_type *type =
514− &mbochs_types[mdev_get_type_group_id(mdev)];
522+ struct mbochs_type *type =
523+ container_of(mdev->type, struct mbochs_type, type);
515524 int avail_mbytes = atomic_read(&mbochs_avail_mbytes);
516525 int ret = -ENOMEM;
517526
@@ -1345,8 +1354,8 @@ static const struct attribute_group *mdev_dev_groups[] = { · 827 unmodified lines
13451354 static ssize_t name_show(struct mdev_type *mtype,
13461355 struct mdev_type_attribute *attr, char *buf)
13471356 {
1348− const struct mbochs_type *type =
1349− &mbochs_types[mtype_get_type_group_id(mtype)];
1357+ struct mbochs_type *type =
1358+ container_of(mtype, struct mbochs_type, type);
13501359
13511360 return sprintf(buf, "%s\n", type->name);
13521361 }
@@ -1355,8 +1364,8 @@ static MDEV_TYPE_ATTR_RO(name); · 2 unmodified lines
13551364 static ssize_t description_show(struct mdev_type *mtype,
13561365 struct mdev_type_attribute *attr, char *buf)
13571366 {
1358− const struct mbochs_type *type =
1359− &mbochs_types[mtype_get_type_group_id(mtype)];
1367+ struct mbochs_type *type =
1368+ container_of(mtype, struct mbochs_type, type);
13601369
13611370 return sprintf(buf, "virtual display, %d MB video memory\n",
13621371 type ? type->mbytes : 0);
@@ -1367,8 +1376,8 @@ static ssize_t available_instances_show(struct mdev_type *mtype, · 4 unmodified lines
13671376 struct mdev_type_attribute *attr,
13681377 char *buf)
13691378 {
1370− const struct mbochs_type *type =
1371− &mbochs_types[mtype_get_type_group_id(mtype)];
1379+ struct mbochs_type *type =
1380+ container_of(mtype, struct mbochs_type, type);
13721381 int count = atomic_read(&mbochs_avail_mbytes) / type->mbytes;
13731382
13741383 return sprintf(buf, "%d\n", count);
@@ -1382,7 +1391,7 @@ static ssize_t device_api_show(struct mdev_type *mtype, · 7 unmodified lines
13821391 }
13831392 static MDEV_TYPE_ATTR_RO(device_api);
13841393
1385−static struct attribute *mdev_types_attrs[] = {
1394+static const struct attribute *mdev_types_attrs[] = {
13861395 &mdev_type_attr_name.attr,
13871396 &mdev_type_attr_description.attr,
13881397 &mdev_type_attr_device_api.attr,
@@ -1390,28 +1399,6 @@ static struct attribute *mdev_types_attrs[] = { · 1 unmodified line
13901399 NULL,
13911400 };
13921401
1393−static struct attribute_group mdev_type_group1 = {
1394− .name = MBOCHS_TYPE_1,
1395− .attrs = mdev_types_attrs,
1396−};
1397−
1398−static struct attribute_group mdev_type_group2 = {
1399− .name = MBOCHS_TYPE_2,
1400− .attrs = mdev_types_attrs,
1401−};
1402−
1403−static struct attribute_group mdev_type_group3 = {
1404− .name = MBOCHS_TYPE_3,
1405− .attrs = mdev_types_attrs,
1406−};
1407−
1408−static struct attribute_group *mdev_type_groups[] = {
1409− &mdev_type_group1,
1410− &mdev_type_group2,
1411− &mdev_type_group3,
1412− NULL,
1413−};
1414−
14151402 static const struct vfio_device_ops mbochs_dev_ops = {
14161403 .close_device = mbochs_close_device,
14171404 .init = mbochs_init_dev,
@@ -1431,7 +1418,7 @@ static struct mdev_driver mbochs_driver = { · 13 unmodified lines
14311418 },
14321419 .probe = mbochs_probe,
14331420 .remove = mbochs_remove,
1434− .supported_type_groups = mdev_type_groups,
1421+ .types_attrs = mdev_types_attrs,
14351422 };
14361423
14371424 static const struct file_operations vd_fops = {
@@ -1476,7 +1463,9 @@ static int __init mbochs_dev_init(void) · 38 unmodified lines
14761463 if (ret)
14771464 goto err_class;
14781465
1479− ret = mdev_register_parent(&mbochs_parent, &mbochs_dev, &mbochs_driver);
1466+ ret = mdev_register_parent(&mbochs_parent, &mbochs_dev, &mbochs_driver,
1467+ mbochs_mdev_types,
1468+ ARRAY_SIZE(mbochs_mdev_types));
14801469 if (ret)
14811470 goto err_device;
14821471
samples/vfio-mdev/mdpy.c+19−31
@@ -51,7 +51,8 @@ MODULE_PARM_DESC(count, "number of " MDPY_NAME " devices"); · 50 unmodified lines
5151 #define MDPY_TYPE_2 "xga"
5252 #define MDPY_TYPE_3 "hd"
5353
54−static const struct mdpy_type {
54+static struct mdpy_type {
55+ struct mdev_type type;
5556 const char *name;
5657 u32 format;
5758 u32 bytepp;
@@ -59,18 +60,21 @@ static const struct mdpy_type { · 1 unmodified line
5960 u32 height;
6061 } mdpy_types[] = {
6162 {
63+ .type.sysfs_name = MDPY_TYPE_1,
6264 .name = MDPY_CLASS_NAME "-" MDPY_TYPE_1,
6365 .format = DRM_FORMAT_XRGB8888,
6466 .bytepp = 4,
6567 .width = 640,
6668 .height = 480,
6769 }, {
70+ .type.sysfs_name = MDPY_TYPE_2,
6871 .name = MDPY_CLASS_NAME "-" MDPY_TYPE_2,
6972 .format = DRM_FORMAT_XRGB8888,
7073 .bytepp = 4,
7174 .width = 1024,
7275 .height = 768,
7376 }, {
77+ .type.sysfs_name = MDPY_TYPE_3,
7478 .name = MDPY_CLASS_NAME "-" MDPY_TYPE_3,
7579 .format = DRM_FORMAT_XRGB8888,
7680 .bytepp = 4,
@@ -79,6 +83,12 @@ static const struct mdpy_type { · 2 unmodified lines
7983 },
8084 };
8185
86+static struct mdev_type *mdpy_mdev_types[] = {
87+ &mdpy_types[0].type,
88+ &mdpy_types[1].type,
89+ &mdpy_types[2].type,
90+};
91+
8292 static dev_t mdpy_devt;
8393 static struct class *mdpy_class;
8494 static struct cdev mdpy_cdev;
@@ -222,7 +232,7 @@ static int mdpy_init_dev(struct vfio_device *vdev) · 137 unmodified lines
222232 container_of(vdev, struct mdev_state, vdev);
223233 struct mdev_device *mdev = to_mdev_device(vdev->dev);
224234 const struct mdpy_type *type =
225− &mdpy_types[mdev_get_type_group_id(mdev)];
235+ container_of(mdev->type, struct mdpy_type, type);
226236 u32 fbsize;
227237 int ret = -ENOMEM;
228238
@@ -655,8 +665,7 @@ static const struct attribute_group *mdev_dev_groups[] = { · 426 unmodified lines
655665 static ssize_t name_show(struct mdev_type *mtype,
656666 struct mdev_type_attribute *attr, char *buf)
657667 {
658− const struct mdpy_type *type =
659− &mdpy_types[mtype_get_type_group_id(mtype)];
668+ struct mdpy_type *type = container_of(mtype, struct mdpy_type, type);
660669
661670 return sprintf(buf, "%s\n", type->name);
662671 }
@@ -665,8 +674,7 @@ static MDEV_TYPE_ATTR_RO(name); · 2 unmodified lines
665674 static ssize_t description_show(struct mdev_type *mtype,
666675 struct mdev_type_attribute *attr, char *buf)
667676 {
668− const struct mdpy_type *type =
669− &mdpy_types[mtype_get_type_group_id(mtype)];
677+ struct mdpy_type *type = container_of(mtype, struct mdpy_type, type);
670678
671679 return sprintf(buf, "virtual display, %dx%d framebuffer\n",
672680 type->width, type->height);
@@ -688,7 +696,7 @@ static ssize_t device_api_show(struct mdev_type *mtype, · 15 unmodified lines
688696 }
689697 static MDEV_TYPE_ATTR_RO(device_api);
690698
691−static struct attribute *mdev_types_attrs[] = {
699+static const struct attribute *mdev_types_attrs[] = {
692700 &mdev_type_attr_name.attr,
693701 &mdev_type_attr_description.attr,
694702 &mdev_type_attr_device_api.attr,
@@ -696,28 +704,6 @@ static struct attribute *mdev_types_attrs[] = { · 1 unmodified line
696704 NULL,
697705 };
698706
699−static struct attribute_group mdev_type_group1 = {
700− .name = MDPY_TYPE_1,
701− .attrs = mdev_types_attrs,
702−};
703−
704−static struct attribute_group mdev_type_group2 = {
705− .name = MDPY_TYPE_2,
706− .attrs = mdev_types_attrs,
707−};
708−
709−static struct attribute_group mdev_type_group3 = {
710− .name = MDPY_TYPE_3,
711− .attrs = mdev_types_attrs,
712−};
713−
714−static struct attribute_group *mdev_type_groups[] = {
715− &mdev_type_group1,
716− &mdev_type_group2,
717− &mdev_type_group3,
718− NULL,
719−};
720−
721707 static const struct vfio_device_ops mdpy_dev_ops = {
722708 .init = mdpy_init_dev,
723709 .release = mdpy_release_dev,
@@ -736,7 +722,7 @@ static struct mdev_driver mdpy_driver = { · 12 unmodified lines
736722 },
737723 .probe = mdpy_probe,
738724 .remove = mdpy_remove,
739− .supported_type_groups = mdev_type_groups,
725+ .types_attrs = mdev_types_attrs,
740726 };
741727
742728 static const struct file_operations vd_fops = {
@@ -779,7 +765,9 @@ static int __init mdpy_dev_init(void) · 36 unmodified lines
779765 if (ret)
780766 goto err_class;
781767
782− ret = mdev_register_parent(&mdpy_parent, &mdpy_dev, &mdpy_driver);
768+ ret = mdev_register_parent(&mdpy_parent, &mdpy_dev, &mdpy_driver,
769+ mdpy_mdev_types,
770+ ARRAY_SIZE(mdpy_mdev_types));
783771 if (ret)
784772 goto err_device;
785773
samples/vfio-mdev/mtty.c+30−30
@@ -143,6 +143,20 @@ struct mdev_state { · 142 unmodified lines
143143 int nr_ports;
144144 };
145145
146+static struct mtty_type {
147+ struct mdev_type type;
148+ int nr_ports;
149+ const char *name;
150+} mtty_types[2] = {
151+ { .nr_ports = 1, .type.sysfs_name = "1", .name = "Single port serial" },
152+ { .nr_ports = 2, .type.sysfs_name = "2", .name = "Dual port serial" },
153+};
154+
155+static struct mdev_type *mtty_mdev_types[] = {
156+ &mtty_types[0].type,
157+ &mtty_types[1].type,
158+};
159+
146160 static atomic_t mdev_avail_ports = ATOMIC_INIT(MAX_MTTYS);
147161
148162 static const struct file_operations vd_fops = {
@@ -707,17 +721,19 @@ static int mtty_init_dev(struct vfio_device *vdev) · 558 unmodified lines
707721 struct mdev_state *mdev_state =
708722 container_of(vdev, struct mdev_state, vdev);
709723 struct mdev_device *mdev = to_mdev_device(vdev->dev);
710− int nr_ports = mdev_get_type_group_id(mdev) + 1;
724+ struct mtty_type *type =
725+ container_of(mdev->type, struct mtty_type, type);
711726 int avail_ports = atomic_read(&mdev_avail_ports);
712727 int ret;
713728
714729 do {
715− if (avail_ports < nr_ports)
730+ if (avail_ports < type->nr_ports)
716731 return -ENOSPC;
717732 } while (!atomic_try_cmpxchg(&mdev_avail_ports,
718− &avail_ports, avail_ports - nr_ports));
733+ &avail_ports,
734+ avail_ports - type->nr_ports));
719735
720− mdev_state->nr_ports = nr_ports;
736+ mdev_state->nr_ports = type->nr_ports;
721737 mdev_state->irq_index = -1;
722738 mdev_state->s[0].max_fifo_size = MAX_FIFO_SIZE;
723739 mdev_state->s[1].max_fifo_size = MAX_FIFO_SIZE;
@@ -735,7 +751,7 @@ static int mtty_init_dev(struct vfio_device *vdev) · 11 unmodified lines
735751 return 0;
736752
737753 err_nr_ports:
738− atomic_add(nr_ports, &mdev_avail_ports);
754+ atomic_add(type->nr_ports, &mdev_avail_ports);
739755 return ret;
740756 }
741757
@@ -1242,11 +1258,9 @@ static const struct attribute_group *mdev_dev_groups[] = { · 500 unmodified lines
12421258 static ssize_t name_show(struct mdev_type *mtype,
12431259 struct mdev_type_attribute *attr, char *buf)
12441260 {
1245− static const char *name_str[2] = { "Single port serial",
1246− "Dual port serial" };
1261+ struct mtty_type *type = container_of(mtype, struct mtty_type, type);
12471262
1248− return sysfs_emit(buf, "%s\n",
1249− name_str[mtype_get_type_group_id(mtype)]);
1263+ return sysfs_emit(buf, "%s\n", type->name);
12501264 }
12511265
12521266 static MDEV_TYPE_ATTR_RO(name);
@@ -1255,9 +1269,10 @@ static ssize_t available_instances_show(struct mdev_type *mtype, · 2 unmodified lines
12551269 struct mdev_type_attribute *attr,
12561270 char *buf)
12571271 {
1258− unsigned int ports = mtype_get_type_group_id(mtype) + 1;
1272+ struct mtty_type *type = container_of(mtype, struct mtty_type, type);
12591273
1260− return sprintf(buf, "%d\n", atomic_read(&mdev_avail_ports) / ports);
1274+ return sprintf(buf, "%d\n", atomic_read(&mdev_avail_ports) /
1275+ type->nr_ports);
12611276 }
12621277
12631278 static MDEV_TYPE_ATTR_RO(available_instances);
@@ -1270,29 +1285,13 @@ static ssize_t device_api_show(struct mdev_type *mtype, · 6 unmodified lines
12701285
12711286 static MDEV_TYPE_ATTR_RO(device_api);
12721287
1273−static struct attribute *mdev_types_attrs[] = {
1288+static const struct attribute *mdev_types_attrs[] = {
12741289 &mdev_type_attr_name.attr,
12751290 &mdev_type_attr_device_api.attr,
12761291 &mdev_type_attr_available_instances.attr,
12771292 NULL,
12781293 };
12791294
1280−static struct attribute_group mdev_type_group1 = {
1281− .name = "1",
1282− .attrs = mdev_types_attrs,
1283−};
1284−
1285−static struct attribute_group mdev_type_group2 = {
1286− .name = "2",
1287− .attrs = mdev_types_attrs,
1288−};
1289−
1290−static struct attribute_group *mdev_type_groups[] = {
1291− &mdev_type_group1,
1292− &mdev_type_group2,
1293− NULL,
1294−};
1295−
12961295 static const struct vfio_device_ops mtty_dev_ops = {
12971296 .name = "vfio-mtty",
12981297 .init = mtty_init_dev,
@@ -1311,7 +1310,7 @@ static struct mdev_driver mtty_driver = { · 12 unmodified lines
13111310 },
13121311 .probe = mtty_probe,
13131312 .remove = mtty_remove,
1314− .supported_type_groups = mdev_type_groups,
1313+ .types_attrs = mdev_types_attrs,
13151314 };
13161315
13171316 static void mtty_device_release(struct device *dev)
@@ -1363,7 +1362,8 @@ static int __init mtty_dev_init(void) · 45 unmodified lines
13631362 goto err_class;
13641363
13651364 ret = mdev_register_parent(&mtty_dev.parent, &mtty_dev.dev,
1366− &mtty_driver);
1365+ &mtty_driver, mtty_mdev_types,
1366+ ARRAY_SIZE(mtty_mdev_types));
13671367 if (ret)
13681368 goto err_device;
13691369 return 0;