qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga
@ 2014-06-26 11:11 Laszlo Ersek
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor Laszlo Ersek
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Laszlo Ersek @ 2014-06-26 11:11 UTC (permalink / raw)
  To: qemu-devel, mprivozn, kraxel, amit.shah, eblake, lcapitulino

Version 2 of the series originally posted at
<http://thread.gmane.org/gmane.comp.emulators.qemu/276342>, rebased to
Wenchao Xia's qapi-event feature, and addressing Eric's review notes for
v1. Changes are broken out per patch.

The series builds at each patch. I repeated the tests described in the
v1 blurb. Please review.

Thanks,
Laszlo

Laszlo Ersek (2):
  virtio-serial: report frontend connection state via monitor
  char: report frontend open/closed state in 'query-chardev'

 qapi-event.json          | 16 ++++++++++++++++
 qapi-schema.json         | 24 +++++++++++++++++++++++-
 hw/char/virtio-console.c | 15 ++++++++++++---
 monitor.c                |  1 +
 qemu-char.c              |  1 +
 qmp-commands.hx          | 19 ++++++++++++++-----
 6 files changed, 67 insertions(+), 9 deletions(-)

-- 
1.8.3.1

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor
  2014-06-26 11:11 [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Laszlo Ersek
@ 2014-06-26 11:11 ` Laszlo Ersek
  2014-06-26 12:15   ` Eric Blake
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev' Laszlo Ersek
  2014-06-26 11:30 ` [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Amit Shah
  2 siblings, 1 reply; 8+ messages in thread
From: Laszlo Ersek @ 2014-06-26 11:11 UTC (permalink / raw)
  To: qemu-devel, mprivozn, kraxel, amit.shah, eblake, lcapitulino

Libvirt wants to know about the guest-side connection state of some
virtio-serial ports (in particular the one(s) assigned to guest agent(s)).
Report such states with a new monitor event.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---

Notes:
    v2:
    - emit event unconditionally; drop per-port "report_connstate" property
      [Eric]
    - rate-limit the new event [Eric] -- unify it with other
      guest-triggerable events in monitor_qapi_event_init()
    - rebased to Wenchao's qapi-event series
    - introduce one event only, VSERPORT_CHANGE, and make the port status a
      parameter [Eric]

 qapi-event.json          | 16 ++++++++++++++++
 qapi-schema.json         | 16 ++++++++++++++++
 hw/char/virtio-console.c | 15 ++++++++++++---
 monitor.c                |  1 +
 4 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/qapi-event.json b/qapi-event.json
index e7a47f9..0ec20c4 100644
--- a/qapi-event.json
+++ b/qapi-event.json
@@ -315,4 +315,20 @@
 ##
 { 'event': 'QUORUM_REPORT_BAD',
   'data': { '*error': 'str', 'node-name': 'str',
             'sector-num': 'int', 'sector-count': 'int' } }
+
+##
+# @VSERPORT_CHANGE
+#
+# Emitted when the guest takes an action that changes the status of a
+# virtio-serial port (eg. opens or closes it).
+#
+# @id: device identifier of the virtio-serial port
+#
+# @status: new status of the virtio-serial port
+#
+# Since: 2.1
+##
+{ 'event': 'VSERPORT_CHANGE',
+  'data': { 'id': 'str',
+            'status': 'VirtioSerialPortStatus' } }
diff --git a/qapi-schema.json b/qapi-schema.json
index e7727a1..d1dc8be 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -3398,5 +3398,21 @@
 ##
 { 'enum': 'GuestPanicAction',
   'data': [ 'pause' ] }
 
+##
+# @VirtioSerialPortStatus
+#
+# An enumeration of the possible / recognized states of virtio-serial ports.
+#
+# @connected: the virtio-serial port has been opened (connected to) in the
+#              guest.
+#
+# @disconnected: the virtio-serial port has been closed (disconnected from) in
+#                the guest.
+#
+# Since: 2.1
+##
+{ 'enum': 'VirtioSerialPortStatus',
+  'data': [ 'connected', 'disconnected' ] }
+
 { 'include': 'qapi-event.json' }
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 6c8be0f..729faac 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -13,8 +13,9 @@
 #include "sysemu/char.h"
 #include "qemu/error-report.h"
 #include "trace.h"
 #include "hw/virtio/virtio-serial.h"
+#include "qapi-event.h"
 
 #define TYPE_VIRTIO_CONSOLE_SERIAL_PORT "virtserialport"
 #define VIRTIO_CONSOLE(obj) \
     OBJECT_CHECK(VirtConsole, (obj), TYPE_VIRTIO_CONSOLE_SERIAL_PORT)
@@ -80,13 +81,21 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
 /* Callback function that's called when the guest opens/closes the port */
 static void set_guest_connected(VirtIOSerialPort *port, int guest_connected)
 {
     VirtConsole *vcon = VIRTIO_CONSOLE(port);
+    DeviceState *dev = DEVICE(port);
 
-    if (!vcon->chr) {
-        return;
+    if (vcon->chr) {
+        qemu_chr_fe_set_open(vcon->chr, guest_connected);
+    }
+
+    if (dev->id) {
+        VirtioSerialPortStatus status = guest_connected ?
+            VIRTIO_SERIAL_PORT_STATUS_CONNECTED :
+            VIRTIO_SERIAL_PORT_STATUS_DISCONNECTED;
+
+        qapi_event_send_vserport_change(dev->id, status, &error_abort);
     }
-    qemu_chr_fe_set_open(vcon->chr, guest_connected);
 }
 
 /* Readiness of the guest to accept data on a port */
 static int chr_can_read(void *opaque)
diff --git a/monitor.c b/monitor.c
index a8ab600..5fbf987 100644
--- a/monitor.c
+++ b/monitor.c
@@ -584,8 +584,9 @@ static void monitor_qapi_event_init(void)
     /* Limit guest-triggerable events to 1 per second */
     monitor_qapi_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000);
     monitor_qapi_event_throttle(QAPI_EVENT_WATCHDOG, 1000);
     monitor_qapi_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000);
+    monitor_qapi_event_throttle(QAPI_EVENT_VSERPORT_CHANGE, 1000);
     /* limit the rate of quorum events to avoid hammering the management */
     monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000);
     monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_FAILURE, 1000);
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev'
  2014-06-26 11:11 [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Laszlo Ersek
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor Laszlo Ersek
@ 2014-06-26 11:11 ` Laszlo Ersek
  2014-06-26 12:09   ` Eric Blake
  2014-06-26 11:30 ` [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Amit Shah
  2 siblings, 1 reply; 8+ messages in thread
From: Laszlo Ersek @ 2014-06-26 11:11 UTC (permalink / raw)
  To: qemu-devel, mprivozn, kraxel, amit.shah, eblake, lcapitulino

In addition to the on-line reporting added in the previous patch, allow
libvirt to query frontend state independently of events.

Libvirt's path to identify the guest agent channel it cares about differs
between the event added in the previous patch and the QMP response field
added here. The event identifies the frontend device, by "id". The
'query-chardev' QMP command identifies the backend device (again by "id").
The association is under libvirt's control.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
---

Notes:
    v2:
    - rename "frontend_open" to "frontend-open" in the schema [Eric]
    - "frontend-open" is mandatory [Eric]
    - advertise / target qemu-2.1 with the new field

 qapi-schema.json |  8 +++++++-
 qemu-char.c      |  1 +
 qmp-commands.hx  | 19 ++++++++++++++-----
 3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/qapi-schema.json b/qapi-schema.json
index d1dc8be..4f968c6 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -210,14 +210,20 @@
 # @label: the label of the character device
 #
 # @filename: the filename of the character device
 #
+# @frontend-open: shows whether the frontend device attached to this backend
+#                 (eg. with the chardev=... option) is in open or closed state
+#                 (since 2.1)
+#
 # Notes: @filename is encoded using the QEMU command line character device
 #        encoding.  See the QEMU man page for details.
 #
 # Since: 0.14.0
 ##
-{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} }
+{ 'type': 'ChardevInfo', 'data': {'label': 'str',
+                                  'filename': 'str',
+                                  'frontend-open': 'bool'} }
 
 ##
 # @query-chardev:
 #
diff --git a/qemu-char.c b/qemu-char.c
index 2e50a10..98fb0ab 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -3703,8 +3703,9 @@ ChardevInfoList *qmp_query_chardev(Error **errp)
         ChardevInfoList *info = g_malloc0(sizeof(*info));
         info->value = g_malloc0(sizeof(*info->value));
         info->value->label = g_strdup(chr->label);
         info->value->filename = g_strdup(chr->filename);
+        info->value->frontend_open = chr->fe_open;
 
         info->next = chr_list;
         chr_list = info;
     }
diff --git a/qmp-commands.hx b/qmp-commands.hx
index e4a1c80..35f5146 100644
--- a/qmp-commands.hx
+++ b/qmp-commands.hx
@@ -1920,21 +1920,30 @@ of all devices.
 Each json-object contain the following:
 
 - "label": device's label (json-string)
 - "filename": device's file (json-string)
+- "frontend-open": open/closed state of the frontend device attached to this
+                   backend (json-bool)
 
 Example:
 
 -> { "execute": "query-chardev" }
 <- {
-      "return":[
+      "return": [
          {
-            "label":"monitor",
-            "filename":"stdio"
+            "label": "charchannel0",
+            "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server",
+            "frontend-open": false
          },
          {
-            "label":"serial0",
-            "filename":"vc"
+            "label": "charmonitor",
+            "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server",
+            "frontend-open": true
+         },
+         {
+            "label": "charserial0",
+            "filename": "pty:/dev/pts/2",
+            "frontend-open": true
          }
       ]
    }
 
-- 
1.8.3.1

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga
  2014-06-26 11:11 [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Laszlo Ersek
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor Laszlo Ersek
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev' Laszlo Ersek
@ 2014-06-26 11:30 ` Amit Shah
  2 siblings, 0 replies; 8+ messages in thread
From: Amit Shah @ 2014-06-26 11:30 UTC (permalink / raw)
  To: Laszlo Ersek; +Cc: mprivozn, lcapitulino, qemu-devel, kraxel

On (Thu) 26 Jun 2014 [13:11:13], Laszlo Ersek wrote:
> Version 2 of the series originally posted at
> <http://thread.gmane.org/gmane.comp.emulators.qemu/276342>, rebased to
> Wenchao Xia's qapi-event feature, and addressing Eric's review notes for
> v1. Changes are broken out per patch.
> 
> The series builds at each patch. I repeated the tests described in the
> v1 blurb. Please review.
> 
> Thanks,
> Laszlo
> 
> Laszlo Ersek (2):
>   virtio-serial: report frontend connection state via monitor
>   char: report frontend open/closed state in 'query-chardev'

Reviewed-by: Amit Shah <amit.shah@redhat.com>


		Amit

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev'
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev' Laszlo Ersek
@ 2014-06-26 12:09   ` Eric Blake
  2014-06-26 13:38     ` Laszlo Ersek
  0 siblings, 1 reply; 8+ messages in thread
From: Eric Blake @ 2014-06-26 12:09 UTC (permalink / raw)
  To: Laszlo Ersek, qemu-devel, mprivozn, kraxel, amit.shah,
	lcapitulino

[-- Attachment #1: Type: text/plain, Size: 1289 bytes --]

On 06/26/2014 05:11 AM, Laszlo Ersek wrote:
> In addition to the on-line reporting added in the previous patch, allow
> libvirt to query frontend state independently of events.
> 
> Libvirt's path to identify the guest agent channel it cares about differs
> between the event added in the previous patch and the QMP response field
> added here. The event identifies the frontend device, by "id". The
> 'query-chardev' QMP command identifies the backend device (again by "id").
> The association is under libvirt's control.
> 
> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> ---
> 

>  ##
> -{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} }
> +{ 'type': 'ChardevInfo', 'data': {'label': 'str',
> +                                  'filename': 'str',
> +                                  'frontend-open': 'bool'} }

Hmm; I wonder if this should instead be
'frontend-status':'VirtioSerialPortStatus', to reuse the type from patch
1/2.  That way, if we ever add a third state, then both the event and
the poll will be reusing the same enum values to report that state.


-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor
  2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor Laszlo Ersek
@ 2014-06-26 12:15   ` Eric Blake
  0 siblings, 0 replies; 8+ messages in thread
From: Eric Blake @ 2014-06-26 12:15 UTC (permalink / raw)
  To: Laszlo Ersek, qemu-devel, mprivozn, kraxel, amit.shah,
	lcapitulino

[-- Attachment #1: Type: text/plain, Size: 1255 bytes --]

On 06/26/2014 05:11 AM, Laszlo Ersek wrote:
> Libvirt wants to know about the guest-side connection state of some
> virtio-serial ports (in particular the one(s) assigned to guest agent(s)).
> Report such states with a new monitor event.
> 
> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> ---
> 

> +++ b/monitor.c
> @@ -584,8 +584,9 @@ static void monitor_qapi_event_init(void)
>      /* Limit guest-triggerable events to 1 per second */
>      monitor_qapi_event_throttle(QAPI_EVENT_RTC_CHANGE, 1000);
>      monitor_qapi_event_throttle(QAPI_EVENT_WATCHDOG, 1000);
>      monitor_qapi_event_throttle(QAPI_EVENT_BALLOON_CHANGE, 1000);
> +    monitor_qapi_event_throttle(QAPI_EVENT_VSERPORT_CHANGE, 1000);
>      /* limit the rate of quorum events to avoid hammering the management */
>      monitor_qapi_event_throttle(QAPI_EVENT_QUORUM_REPORT_BAD, 1000);

Trivial merge conflict with Wenchao's pending patch:
https://lists.gnu.org/archive/html/qemu-devel/2014-06/msg05897.html
but the resolution is obvious.

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev'
  2014-06-26 12:09   ` Eric Blake
@ 2014-06-26 13:38     ` Laszlo Ersek
  2014-06-26 15:09       ` Eric Blake
  0 siblings, 1 reply; 8+ messages in thread
From: Laszlo Ersek @ 2014-06-26 13:38 UTC (permalink / raw)
  To: Eric Blake, qemu-devel, mprivozn, kraxel, amit.shah, lcapitulino

On 06/26/14 14:09, Eric Blake wrote:
> On 06/26/2014 05:11 AM, Laszlo Ersek wrote:
>> In addition to the on-line reporting added in the previous patch, allow
>> libvirt to query frontend state independently of events.
>>
>> Libvirt's path to identify the guest agent channel it cares about differs
>> between the event added in the previous patch and the QMP response field
>> added here. The event identifies the frontend device, by "id". The
>> 'query-chardev' QMP command identifies the backend device (again by "id").
>> The association is under libvirt's control.
>>
>> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1080376
>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>> ---
>>
> 
>>  ##
>> -{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} }
>> +{ 'type': 'ChardevInfo', 'data': {'label': 'str',
>> +                                  'filename': 'str',
>> +                                  'frontend-open': 'bool'} }
> 
> Hmm; I wonder if this should instead be
> 'frontend-status':'VirtioSerialPortStatus', to reuse the type from patch
> 1/2.  That way, if we ever add a third state, then both the event and
> the poll will be reusing the same enum values to report that state.

I expected this remark :)

The difference is rooted in the fact that the event approaches the
virtio-serial port status from the frontend (ie. guest) side, while the
query approaches the same from the backend (ie. host, chardev) side.

If I wanted to bring those in future-proof sync, then I would have to
change the underlying, generic chardev machinery -- namely, the fe_open
field, and everything that operates on it.

I actually considered the other direction too: rather than introducing
status:VirtioSerialPortStatus, just add open:bool (which was your
original suggestion in your v1 review). I decided against it because the
current list of enum constants (connected, disconnected) expresses just
the same, and it'll be a *tiny* bit easier to extend, should that
necessity arise.

Sounds acceptible? :) If not, then I'm OK to replace
status:VirtioSerialPortStatus with open:bool in the first patch.

Thanks,
Laszlo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev'
  2014-06-26 13:38     ` Laszlo Ersek
@ 2014-06-26 15:09       ` Eric Blake
  0 siblings, 0 replies; 8+ messages in thread
From: Eric Blake @ 2014-06-26 15:09 UTC (permalink / raw)
  To: Laszlo Ersek, qemu-devel, mprivozn, kraxel, amit.shah,
	lcapitulino

[-- Attachment #1: Type: text/plain, Size: 1976 bytes --]

On 06/26/2014 07:38 AM, Laszlo Ersek wrote:

>>>  ##
>>> -{ 'type': 'ChardevInfo', 'data': {'label': 'str', 'filename': 'str'} }
>>> +{ 'type': 'ChardevInfo', 'data': {'label': 'str',
>>> +                                  'filename': 'str',
>>> +                                  'frontend-open': 'bool'} }
>>
>> Hmm; I wonder if this should instead be
>> 'frontend-status':'VirtioSerialPortStatus', to reuse the type from patch
>> 1/2.  That way, if we ever add a third state, then both the event and
>> the poll will be reusing the same enum values to report that state.
> 
> I expected this remark :)
> 
> The difference is rooted in the fact that the event approaches the
> virtio-serial port status from the frontend (ie. guest) side, while the
> query approaches the same from the backend (ie. host, chardev) side.
> 
> If I wanted to bring those in future-proof sync, then I would have to
> change the underlying, generic chardev machinery -- namely, the fe_open
> field, and everything that operates on it.
> 
> I actually considered the other direction too: rather than introducing
> status:VirtioSerialPortStatus, just add open:bool (which was your
> original suggestion in your v1 review). I decided against it because the
> current list of enum constants (connected, disconnected) expresses just
> the same, and it'll be a *tiny* bit easier to extend, should that
> necessity arise.
> 
> Sounds acceptible? :) If not, then I'm OK to replace
> status:VirtioSerialPortStatus with open:bool in the first patch.

If we ever add another state in the future, then both places would be
touched at the same time to figure out how to support that new state.
So I agree with your counter-proposal of just simplifying things to use
open:bool in the first patch; it also has the benefit of less code (no
need to add an enum).

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2014-06-26 15:09 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-06-26 11:11 [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Laszlo Ersek
2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 1/2] virtio-serial: report frontend connection state via monitor Laszlo Ersek
2014-06-26 12:15   ` Eric Blake
2014-06-26 11:11 ` [Qemu-devel] [PATCH for-2.1 v2 2/2] char: report frontend open/closed state in 'query-chardev' Laszlo Ersek
2014-06-26 12:09   ` Eric Blake
2014-06-26 13:38     ` Laszlo Ersek
2014-06-26 15:09       ` Eric Blake
2014-06-26 11:30 ` [Qemu-devel] [PATCH for-2.1 v2 0/2] help libvirt know what's up with qga Amit Shah

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).