[PATCH] USB: update usbmon, fix glued lines
authorPete Zaitcev <zaitcev@redhat.com>
Sat, 10 Jun 2006 03:10:10 +0000 (20:10 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 21 Jun 2006 22:04:17 +0000 (15:04 -0700)
This update contains one bug fix: some lines can come out truncated,
because of the safety cutoff. This happened because I forgot to update
the size when status packets began to be printed.

The rest is:
 - Comments updates
 - Allow snooping with pkmap on x86_64, which is cache-coherent
 - Enlarge event buffers (certainly we can have a couple of pages)
 - Add event counter

First touch upon usbmon for 2.6.18.

Signed-off-by: Pete Zaitcev <zaitcev@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/mon/mon_dma.c
drivers/usb/mon/mon_main.c
drivers/usb/mon/mon_stat.c
drivers/usb/mon/mon_text.c
drivers/usb/mon/usb_mon.h

index 0a1367b760a00947e72d1b539d3dc9f6e32cd3f5..ddcfc01e77a022918940d725986ff0061591f6cb 100644 (file)
 #include <linux/usb.h> /* Only needed for declarations in usb_mon.h */
 #include "usb_mon.h"
 
-#ifdef __i386__                /* CONFIG_ARCH_I386 does not exit */
+/*
+ * PC-compatibles, are, fortunately, sufficiently cache-coherent for this.
+ */
+#if defined(__i386__) || defined(__x86_64__) /* CONFIG_ARCH_I386 doesn't exit */
 #define MON_HAS_UNMAP 1
 
 #define phys_to_page(phys)     pfn_to_page((phys) >> PAGE_SHIFT)
index 6ecc273022117351f9d155e3d16ab6d3a8a7ab34..86db92b4915b550a08fd6acd31861b647c376c74 100644 (file)
@@ -97,6 +97,7 @@ static void mon_submit(struct usb_bus *ubus, struct urb *urb)
        if (mbus->nreaders == 0)
                goto out_locked;
 
+       mbus->cnt_events++;
        list_for_each (pos, &mbus->r_list) {
                r = list_entry(pos, struct mon_reader, r_link);
                r->rnf_submit(r->r_data, urb);
@@ -152,6 +153,7 @@ static void mon_complete(struct usb_bus *ubus, struct urb *urb)
        }
 
        spin_lock_irqsave(&mbus->lock, flags);
+       mbus->cnt_events++;
        list_for_each (pos, &mbus->r_list) {
                r = list_entry(pos, struct mon_reader, r_link);
                r->rnf_complete(r->r_data, urb);
@@ -163,7 +165,6 @@ static void mon_complete(struct usb_bus *ubus, struct urb *urb)
 
 /*
  * Stop monitoring.
- * Obviously this must be well locked, so no need to play with mb's.
  */
 static void mon_stop(struct mon_bus *mbus)
 {
index 6e4b165d070ad6cfac00ab11c30ad9d206d8a709..1fe01d994a793f79ec801a663a8ddb1eec54a345 100644 (file)
@@ -31,8 +31,8 @@ static int mon_stat_open(struct inode *inode, struct file *file)
        mbus = inode->u.generic_ip;
 
        sp->slen = snprintf(sp->str, STAT_BUF_SIZE,
-           "nreaders %d text_lost %u\n",
-           mbus->nreaders, mbus->cnt_text_lost);
+           "nreaders %d events %u text_lost %u\n",
+           mbus->nreaders, mbus->cnt_events, mbus->cnt_text_lost);
 
        file->private_data = sp;
        return 0;
index ac043ec2b8dcece7b124b8917bd21ab69a1c70ad..9f9236bf62d24117bf909a71eecb87ba16401d0d 100644 (file)
 
 /*
  * This limit exists to prevent OOMs when the user process stops reading.
+ * If usbmon were available to unprivileged processes, it might be open
+ * to a local DoS. But we have to keep to root in order to prevent
+ * password sniffing from HID devices.
  */
-#define EVENT_MAX  25
+#define EVENT_MAX  (2*PAGE_SIZE / sizeof(struct mon_event_text))
 
-#define PRINTF_DFL  130
+#define PRINTF_DFL  160
 
 struct mon_event_text {
        struct list_head e_link;
@@ -111,7 +114,7 @@ static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb,
         * number of corner cases, but it seems that the following is
         * more or less safe.
         *
-        * We do not even try to look transfer_buffer, because it can
+        * We do not even try to look at transfer_buffer, because it can
         * contain non-NULL garbage in case the upper level promised to
         * set DMA for the HCD.
         */
index 8e0613c350ccdd196008de7a8f16a4c02e26bb7e..92702835b1e5b8ac86c2f34f06f5f97c570163c9 100644 (file)
@@ -27,6 +27,7 @@ struct mon_bus {
        struct kref ref;                /* Under mon_lock */
 
        /* Stats */
+       unsigned int cnt_events;
        unsigned int cnt_text_lost;
 };